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