编译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)的任务是定位库,并将它们组合起来执行

为了定位库,动态链接器构造一个搜索路径(类似于路径)。这包括:

  • 图书馆路径
  • 添加到可执行文件的硬编码目录
  • 默认文件夹(/lib、/usr/lib等)
  • 在上述情况下,看起来既没有使用#1也没有使用#2,而且库不在默认位置。可以使用#1或#2进行修复

    有关详细信息,请咨询曼恩ld.so

    根据个人经验,在处理“一次性”库时,最好使用“rpath”(#2)方法。尝试向LD_LIBRARY_路径中添加大量位置很容易导致难以管理的长LD_LIBRARY_路径。当创建包装器脚本来启动程序时,使用LD_LIBRARY_PATH最有效

    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