Установка Apache Avro C

#c #linux #gcc #avro

#c #linux #gcc #avro

Вопрос:

Я работаю над проектом и использую Apache Avro. Я скачал Apache Avro для C и следовал инструкциям, приведенным для его установки в моей системе (Ubuntu Linux версии 14.04). После установки у меня есть несколько заголовочных файлов в /include каталоге и несколько библиотек в /lib каталоге. Все это те, которые были установлены из Apache Avro.

На данный момент я создал свои исходные файлы на C, которые выглядят следующим образом:

1) socket_client.h :

 #include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "avro.h"
#include <errno.h>
#include <stdint.h>

#ifndef SOCKET_CLIENT_H_
#define SOCKET_CLIENT_H_

void init_schema(void);

int client_execution_connect(char* ip_addr, int port, char* type);

#endif /* SOCKET_CLIENT_H_ */
 

2) socket_client.c :

 #include <stdio.h>
#include "socket_client.h"

avro_schema_t bigpeer_schema;
void init_schema(void)
{
    if( avro_schema_from_json_literal(BIG_PEER_SCHEMA, amp;bigpeer_schema) )
    {
        printf("Unable to parse big_peer schema");
        exit(EXIT_FAILURE);
    }
}
int client_execution_connect(char* ip_addr, int port, char* type)
{
    ...
}
 

и тестовый основной файл. Кроме того, я создал следующий makefile для компиляции моего кода:

 CC=gcc
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=test_main.c socket_client.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=avro_test
INC_PATH=/include/avro/

INC=-I/include
LIB=-L/lib

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(LIB) $(OBJECTS) -o $@

.c.o:
    $(CC) $(INC) $(CFLAGS)

lt; -o $@

clean:
rm -rf *.o avro_test

Но, когда я пытаюсь подать свою заявку, я получаю следующее:

 nick@rethimno:~/Downloads/AvroClient$ make
gcc -I/include -c -Wall test_main.c -o test_main.o
test_main.c: In function ‘main’:
test_main.c:22:6: warning: unused variable ‘port’ [-Wunused-variable]
  int port = atoi(argv[2]);
      ^
test_main.c:15:8: warning: unused variable ‘type’ [-Wunused-variable]
   char* type = "db_node";
        ^
gcc -I/include -c -Wall socket_client.c -o socket_client.o
gcc  -L/lib test_main.o socket_client.o -o avro_test
socket_client.o: In function `init_schema':
socket_client.c:(.text 0x14): undefined reference to `avro_schema_from_json_length'
collect2: error: ld returned 1 exit status
make: *** [avro_test] Error 1
 

Что я делаю не так? Я не совсем уверен, правильно ли загружены библиотеки Apache Avro.

Спасибо, Ник

Ответ №1:

Вы включаете заголовки Avro, но вы не связываете свой конечный исполняемый файл с библиотеками Avro. Предполагая, что у вас есть libavro.so или libavro.a в lib каталоге (где *.so находится общая библиотека и *.a является статической библиотекой), вы захотите изменить эту строку вашего Makefile:

LDFLAGS=-lavro

Обратите внимание, что, если двоичный файл библиотеки вызывается как-то иначе, чем libavro.so или libavro.a , вам нужно будет изменить -lavro значение, чтобы оно соответствовало. Также обратите внимание, что некоторые пакеты могут содержать более одной общей библиотеки, с которой вам нужно будет связать. Я недостаточно знаком с Apache Avro, чтобы сказать, так это или нет; в основном вам просто нужно посмотреть и посмотреть, что находится внутри вашего lib каталога.

Вы можете получить дополнительную информацию о связывании с библиотеками в документации GCC.

Комментарии:

1. Спасибо за ваш ответ. Я согласен с вашим ответом и пытаюсь связать необходимые библиотеки с помощью команды makefile gcc -L/lib test_main.o socket_client.o -o avro_test . Все библиотеки Avro (статические и общие) находятся в /lib папке. Должно быть, я делаю что-то не так.

2. -L... просто сообщает GCC, где искать библиотеки, на самом деле это не указывает ему на ссылку на какую-либо из них. Вам нужно так -L/lib же хорошо, как -lavro и все остальное.

3. На самом деле, это сработало. Проблема заключалась в том, что я не использовал -lavro , и поэтому соединение не удалось. Большое вам спасибо за вашу помощь.