繁体   English   中英

在C ++中链接库

[英]Linking libraries in c++

我有一个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 ++命令提供链接库?

因为共享库在运行时被链接-您需要将位置添加到库搜索路径中(如已完成),将其放置在现有路径中的某个位置(例如/usr/lib ),或添加符号链接链接到现有库路径的现有库路径。

如果要在没有运行时依赖关系的情况下编译该库,则需要一个静态库(该库为abc.a )-请注意,这有很多缺点,但是(如果该库已更新,则需要重新编译可执行文件以合并该更新)。

为什么我不能通过g ++命令提供链接库?

您可以链接,并且成功链接了库。 否则,您将无法生成可执行文件(在您的情况下为a.out)。 您混合了2种不同的问题:与共享库链接并在运行时加载它们。 加载共享库是一个非常复杂的概念,在这里从3.2中读取Program-Library-HOWTO可以很好地描述。

动态链接是GCC的默认行为。 LD_LIBRARY_PATH用于指定在哪里查找库的目录(使用特定库的一种强制执行方式),请阅读: Program-Library-HOWTO以获取更多信息。 还有一个ld选项-rpath为正在编译的二进制文件指定库搜索路径(此信息写在二进制文件中,仅用于该二进制文件,LD_LIBRARY_PATH影响使用同一库的其他应用程序,可能期望使用新版本或旧版本)。

可以进行静态链接(但有些棘手),并且不需要依赖项(但有时不建议这样做),因为例如出于安全原因,阻止更新依赖库,在静态链接中,您始终使用库的版本您在编译二进制文件时已拥有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM