Gcc 为什么找不到我的共享库?
我正在尝试编译一个示例程序,该程序链接到由生成的共享库。我是这样编译程序的Gcc 为什么找不到我的共享库?,gcc,shared-libraries,ld,Gcc,Shared Libraries,Ld,我正在尝试编译一个示例程序,该程序链接到由生成的共享库。我是这样编译程序的 $ gcc -o sd sundown.c -L. -lsundown 然而,当我运行它时,我得到以下错误 ./sd:加载共享库时出错:libsundown.so:无法打开共享对象 文件:没有这样的文件或目录 ls的输出为 $ ls libsundown.so libsundown.so.1 sundown.c sd 为什么ld找不到共享库?简短解决方案: 将(或-L标志中的任何内容)添加到LD\u库路径中。当
$ gcc -o sd sundown.c -L. -lsundown
然而,当我运行它时,我得到以下错误
./sd:加载共享库时出错:libsundown.so:无法打开共享对象
文件:没有这样的文件或目录
ls
的输出为
$ ls
libsundown.so libsundown.so.1 sundown.c sd
为什么ld
找不到共享库?简短解决方案:
将
(或-L
标志中的任何内容)添加到LD\u库路径中。当您运行sd
时,它将在标准位置和LD_LIBRARY_路径中查找库。请注意,由于您添加了
,因此只有从同一目录libsundown.so中运行sd
时,此操作才有效
我计划分发已编译的二进制文件。我如何才能在不强制人们编辑其LD_library_路径的情况下分发库
您应该在标准位置之一安装libsundown.so,如/usr/lib或/usr/local/lib。您可以使用安装程序或make文件,或者像安装或自述这样简单的东西来完成此操作,它会告诉用户将库粘贴在那里,并确保权限设置为合理的值。在带有/usr/lib和/usr/lib64的Centos系统上,如果您手动将64位libs安装到/usr/lib中,则在运行时,该库可能不可见,即使在构建时它是可见的(我使用了autotools,它能够从/usr/lib中找到我的zopfli库,没有任何问题)。当我执行链接到/usr/lib/libzopfli.so.1的my_二进制文件时,我得到了
libzopfli.so.1 => not found
将libzopfly.so.1从/usr/lib移动到/usr/lib64后,一切正常。将
添加到LD\u LIBRARY\u PATH
env变量?@JonLin Wow。这确实奏效了。但是为什么-L
标志不起作用呢?-L告诉gcc在哪里查找库,以便它可以链接,而不是编译后的库binary@JonLin我计划分发已编译的二进制文件。我如何才能在不强制人们编辑其LD\u library\u路径的情况下分发库?太棒了!谢谢你的帮助,这让我困惑了好几天=P