基于rabbitmq-c构建

基于rabbitmq-c构建,c,rabbitmq,C,Rabbitmq,我正在尝试用c连接rabbitmq,但每次都失败了。我是这样做的 下载rabbitmq-c 安装它(make&&make install)只是为了确保满足依赖关系。 在amqp\u sendstring.c 使用make重新构建,运行/amqp\u sendstring并正常工作 然后,我开始创建自己的文件,并使用以下命令通过gcc进行编译: 讽刺的是,它未能与librabbitmq链接,错误如下: /tmp/cc63IlXq.o: In function `main': test.c

我正在尝试用c连接rabbitmq,但每次都失败了。我是这样做的

下载rabbitmq-c
安装它(
make&&make install
)只是为了确保满足依赖关系。
amqp\u sendstring.c

使用
make
重新构建,运行
/amqp\u sendstring
并正常工作
然后,我开始创建自己的文件,并使用以下命令通过gcc进行编译:

讽刺的是,它未能与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能够找到头,但不能找到库

下面是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;
}
#包括
#包括
int main(int argc,char const*const*argv){
amqp连接状态连接;
conn=amqp_新_连接();
amqp_破坏_连接(conn);
返回0;
}
有人能给我指一下正确的方向吗


编辑:我忘了提到我在一个ubuntu盒子上(12.04)。但是,我认为这是在上面的语句中隐含的。

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

因此,您的
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 <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$
您可以使用
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$
另见

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