我有一个C ++文件 a.cpp ,路径/ home / name / lib中的库依赖项和库 abc.so 的名称。
我按如下方式进行编译:
g++ a.cpp -L/home/name/lib -labc
这编译程序没有错误。 但是在运行程序时,我得到了错误:
./ a.out:加载共享库时出错:libabc.so.0:无法打开共享对象文件:没有这样的文件或目录
但是,如果在运行程序之前,我将库路径添加为
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/name/lib;
现在编译运行,它运行正常。
为什么我无法通过g ++命令提供它来链接库?
答案 0 :(得分:1)
因为共享对象库在运行时链接 - 您需要将位置添加到库搜索路径(就像您已经完成的那样),将其放在已存在的路径中的某个位置(如/usr/lib
) ,或添加指向链接到其存在位置的现有库路径的符号链接。
如果你想编译库,所以没有运行时依赖,你需要一个静态库(abc.a
) - 请注意,这有很多缺点,但是(如果是库)更新后,您需要重新编译可执行文件以包含该更新。
答案 1 :(得分:1)
为什么我无法通过g ++命令提供它来链接库?
您可以链接,并且您确实成功链接了库。否则你将无法构建可执行文件(在你的情况下是a.out)。您混合了两个不同的问题:链接共享库并在运行时加载它们。加载共享库是一个非常复杂的概念,并且从3.2中读取Program-Library-HOWTO。
答案 2 :(得分:0)
您是动态链接,是GCC的默认行为。 LD_LIBRARY_PATH用于指定查找库的目录(使用特定库的强制方式),请阅读:Program-Library-HOWTO以获取更多信息。还有一个ld选项-rpath来指定正在编译的二进制文件的库搜索路径(此信息以二进制文件编写,仅用于该二进制文件,LD_LIBRARY_PATH影响使用相同库的其他应用程序,可能需要新版本或旧版本)。
静态链接是可能的(但有点棘手)并且不需要依赖(但有时不推荐,因为防止依赖库的更新,例如出于安全原因,在静态链接中你总是使用版本编译二进制文件时的库。