我正在尝试连接到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 <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盒子(12.04)。认为它在上述陈述中含蓄暗示。
答案 0 :(得分:6)
编译程序时,您必须告诉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克隆的位置。
标题和共享库的位置:
~/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$