首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对rabbitmq-c进行构建

针对rabbitmq-c进行构建
EN

Stack Overflow用户
提问于 2012-08-20 00:31:15
回答 1查看 6.8K关注 0票数 8

我尝试在c中连接到rabbitmq,但每次都失败。这就是我是如何做到的。

下载rabbitmq-c

安装它(make && make install)只是为了确保满足依赖关系。

修改了amqp_sendstring.c中的连接变量

使用make重新构建,运行./amqp_sendstring并正常工作

然后我开始创建我自己的文件,并通过gcc编译它们,使用:

代码语言:javascript
复制
gcc -lrabbitmq -o j_test test.c

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

代码语言:javascript
复制
/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能够找到头文件,但找不到库。

以下是test.c的源代码:

代码语言:javascript
复制
#include <amqp.h>
#include <amqp_framing.h>
int main(int argc, char const * const *argv) {
   amqp_connection_state_t conn;
   conn = amqp_new_connection();
   amqp_destroy_connection(conn);
   return 0;
}

有谁能给我指个方向吗?

编辑:我忘了说我在一个ubuntu box上(12.04)。但我认为这在上面的语句中是隐含的。

EN

回答 1

Stack Overflow用户

发布于 2012-08-22 04:18:06

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

因此,您的gcc命令行应该如下所示:

代码语言:javascript
复制
gcc -I/path/to/rabbitmq-c-header-dir -L/path/to/rabbitmq-c-lib-dir -o j_test test.c -lrabbitmq

请注意,您必须告知头文件(-I)的位置,并且the position of -lrabbitmq很重要。

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

头文件和共享库的位置:

代码语言:javascript
复制
~/src/rabbitmq-c$ find . -name amqp.h
./librabbitmq/amqp.h
~/src/rabbitmq-c$ find . -name librabbitmq.so
./librabbitmq/.libs/librabbitmq.so
~/src/rabbitmq-c$

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

代码语言:javascript
复制
~/src/rabbitmq-c$ cat > stacko.c
#include <amqp.h>
#include <amqp_framing.h>
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$

对于共享库,人们还必须在运行时告知哪里可以找到这些库:

代码语言:javascript
复制
~/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一起使用的库

代码语言:javascript
复制
~/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++: how to specify preference of library path?

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12028112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档