针对rabbitmq-c构建

Jer*_*ian 7 c rabbitmq

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

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

gcc -lrabbitmq -o j_test test.c
Run Code Online (Sandbox Code Playgroud)

具有讽刺意味的是,它无法与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
Run Code Online (Sandbox Code Playgroud)

我从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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*735 7

编译程序时,您不仅要告诉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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须告诉头文件(-I)的位置 以及位置-lrabbitmq是否重要.

在下面的示例中,directory ~/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$
Run Code Online (Sandbox Code Playgroud)

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

~/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$
Run Code Online (Sandbox Code Playgroud)

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

~/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$
Run Code Online (Sandbox Code Playgroud)

您可以检查可执行文件使用的库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$
Run Code Online (Sandbox Code Playgroud)

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