gpt4 book ai didi

c - 针对 rabbitmq-c 构建

转载 作者:太空狗 更新时间:2023-10-29 17:23:03 27 4
gpt4 key购买 nike

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

下载rabbitmq-c
安装它 (make && make install) 只是为了确保满足依赖关系。
amqp_sendstring.c 中修改的连接变量
使用 make 重建,运行 ./amqp_sendstring 并且成功了
然后我开始创建自己的文件并通过 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 能够找到 header 但不能找到库。

这里是test.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;
}

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

编辑:我忘了说我在 ubuntu box (12.04) 上。认为它隐含在上面的陈述中。

最佳答案

当你编译你的程序时,你不仅要告诉 gcc 你将要使用的库的名称 (-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) 和 the position of -lrabbitmq 很重要。

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

header 和共享库的位置:

~/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 <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$

对于共享库,还必须在运行时告知将在何处找到库:

~/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++: how to specify preference of library path? .

关于c - 针对 rabbitmq-c 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com