针对rabbitmq-c构建

我试图在c中连接到rabbitmq并且每次都失败了。 我是这样做的。

下载了rabbitmq-c
安装它( make && make install )只是为了确保满足依赖性。
修改了amqp_sendstring.c连接变量
使用make重建,运行./amqp_sendstring并且它有效
然后我开始创建自己的文件并使用gcc通过gcc编译它们:

 gcc -lrabbitmq -o j_test test.c 

具有讽刺意味的是,它无法与librabbitmq链接以下错误:

 /tmp/cc63IlXq.o: In function `main': test.c:(.text+0xa): undefined reference to `amqp_new_connection' test.c:(.text+0x1a): undefined reference to `amqp_destroy_connection' collect2: ld returned 1 exit status 

我从ampq_ *开始删除了所有内容。 瞧! 它成功建成。 这对我来说是gcc能够找到头而不是lib的指示器。

这是test.c源代码:

 #include  #include  int main(int argc, char const * const *argv) { amqp_connection_state_t conn; conn = amqp_new_connection(); amqp_destroy_connection(conn); return 0; } 

有人请指出我正确的方向吗?

编辑:我忘了提到我在一个ubuntu盒子(12.04)。 认为它隐含在上述陈述中。

编译程序时,您必须告诉gcc不仅要使用的库的名称( -lrabbimtq ),还要-lrabbimtq从中搜索库的路径(即目录)(- -L/path/to/rabbitmq-c )在链接期间。 gcc (或链接器)将始终查找某些默认目录,但您的rabbitmq-c库在这些目录中不可用。

所以你的gcc命令行应如下所示:

 gcc -I/path/to/rabbitmq-c-header-dir -L/path/to/rabbitmq-c-lib-dir -o j_test test.c -lrabbitmq 

请注意,您必须告诉头文件( -I ) 的位置, -lrabbitmq 的位置很重要。

在下面的例子中,目录~/src/rabbitmq-c是我的rabbitmq-c克隆的位置。

标头和共享库的位置:

 ~/src/rabbitmq-c$ find . -name amqp.h ./librabbitmq/amqp.h ~/src/rabbitmq-c$ find . -name librabbitmq.so ./librabbitmq/.libs/librabbitmq.so ~/src/rabbitmq-c$ 

编译和链接您的示例程序:

 ~/src/rabbitmq-c$ cat > stacko.c #include  #include  int main(int argc, char const * const *argv) { amqp_connection_state_t conn; conn = amqp_new_connection(); amqp_destroy_connection(conn); return 0; } ~/src/rabbitmq-c$ gcc -Ilibrabbitmq -g -Wall -c stacko.c ~/src/rabbitmq-c$ gcc -Llibrabbitmq/.libs -g -Wall -o stacko stacko.o -lrabbitmq ~/src/rabbitmq-c$ 

使用共享库时,还必须在运行时告诉您将找到库:

 ~/src/rabbitmq-c$ ./stacko ./stacko: error while loading shared libraries: librabbitmq.so.0: cannot open shared object file: No such file or directory ~/src/rabbitmq-c$ LD_LIBRARY_PATH=librabbitmq/.libs ./stacko ~/src/rabbitmq-c$ 

您可以使用ldd检查可执行文件使用的库:

 ~/src/rabbitmq-c$ ldd ./stacko linux-gate.so.1 => (0x00d7d000) librabbitmq.so.0 => not found libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00396000) /lib/ld-linux.so.2 (0x002d6000) ~/src/rabbitmq-c$ LD_LIBRARY_PATH=librabbitmq/.libs ldd ./stacko linux-gate.so.1 => (0x001c8000) librabbitmq.so.0 => librabbitmq/.libs/librabbitmq.so.0 (0x00f77000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x001c9000) /lib/ld-linux.so.2 (0x00cc3000) ~/src/rabbitmq-c$ 

另请参阅g ++:如何指定库路径的首选项? 。