Apache Avro C安装

时间:2014-06-19 20:49:23

标签: c linux gcc avro

我正在开发一个项目,我正在使用Apache Avro。我已经下载了Apache Avro for C,我按照提供的说明将其安装到我的系统上(Ubuntu Linux v14.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, &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) $< -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 个答案:

答案 0 :(得分:1)

您包含Avro标头,但您并未将最终可执行文件与Avro库链接。假设libavro.so目录中有libavro.alib*.so是共享库,*.a是静态库),您需要更改Makefile的这一行:

LDFLAGS=-lavro

请注意,如果库二进制文件被称为libavro.solibavro.a以外的其他内容,则您需要更改-lavro值才能匹配。另请注意,某些包可能包含多个需要链接的共享库。我对Apache Avro不太熟悉,不知道是否是这种情况;您大多只需要查看lib目录中的内容。

您可以在GCC documentation

中找到有关链接到库的更多信息