编译C程序时未找到共享库
我有一个简单的程序,看起来是这样的:编译C程序时未找到共享库,c,compilation,C,Compilation,我有一个简单的程序,看起来是这样的: #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; } 我得到了所有需要的头文件
#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;
}
我得到了所有需要的头文件:
amqp.h
amqp_framing.h
amqp_tcp_socket.h
当我跑的时候
$ ls /rabbitmq-c/_install/include/
$ ls /rabbitmq-c/_build/librabbitmq/
我看到了所有需要的“.so”文件:
最后,我编译了自己的程序,如下所示:
$ gcc -I/rabbitmq-c/_install/include/ -g -Wall -c main.c
$ gcc -L/rabbitmq-c/_build/librabbitmq/ -g -Wall -o rabbit main.o -lrabbitmq
它编译时没有错误。然而,当我这样做时:
$ ldd ./rabbit
我得到这个信息:
librabbitmq.so.4=>未找到
那么,我遗漏了什么以及如何修复它呢?当您将共享库链接到可执行文件中时,链接器会将库名(在本例中为
librabbitmq.So.4
)记录到可执行文件中。动态链接器(ld.so)的任务是定位库,并将它们组合起来执行
为了定位库,动态链接器构造一个搜索路径(类似于路径)。这包括:
File: rabbit-run (same folder as executable)
# Prepend rabbitmq SO location to current LD_LIBRARY_PATH
LD_LIBRARY_PATH=LD_LIBRARY_PATH=/rabbitmq-c/_build/librabbitmq${LD_LIBRARY_PATH+:$X}
# Execute the binary, from the same location of the launcher
${0%/*}/./rabbit
如果二进制文件找不到“librabbitmq.so.4”,则表示ld(动态链接器)找不到此共享对象 第一步,执行“ldconfig”。这能解决你的问题吗? 对酷 如果没有,那么您必须告诉ldconfig在哪里可以找到“librabbitmq.so.4”。 因此,要么将其移动到已知文件夹(例如LD_LIBRARY_PATH)中,要么添加它,以便LD知道它
echo '/rabbitmq-c/_build/librabbitmq' > '/etc/ld.so.conf.d/name_this_file_yourself.conf'
ldconfig
这将解决您的问题。是否没有关于如何正确安装rabbitmq以使其位于系统文件夹中的说明?谢谢!我马上查!
File: rabbit-run (same folder as executable)
# Prepend rabbitmq SO location to current LD_LIBRARY_PATH
LD_LIBRARY_PATH=LD_LIBRARY_PATH=/rabbitmq-c/_build/librabbitmq${LD_LIBRARY_PATH+:$X}
# Execute the binary, from the same location of the launcher
${0%/*}/./rabbit
echo '/rabbitmq-c/_build/librabbitmq' > '/etc/ld.so.conf.d/name_this_file_yourself.conf'
ldconfig