gpt4 book ai didi

c++ - 链接器如何在使用不同编译器编译的动态库中选择动态库

转载 作者:行者123 更新时间:2023-11-28 07:56:00 25 4
gpt4 key购买 nike

我有一个 C++ 项目,目前没有链接到任何外部动态库。我正在考虑在未来使用一些需要构建的 boost 库(不仅仅是标题)。目前,在开发阶段,我使用三种不同的工具链构建我的项目:g++LLVM/Clang++Intel C++,平台是 Linux。这些编译器 AFAIK 是相互二进制兼容的,例如g++ 编译的应用程序可以使用 Intel C++ 编译的动态库。

我构建了 boost 二进制文件并将它们安装到不同的文件夹中。例如build_gcc, build_icc。然后我将这些文件夹的路径添加到系统 LIBRARY_PATH。问题是:如果我现在使用 g++Intel C++ 构建我的项目并链接一些动态库,例如写

-lboost_math_tr1

makefile 中,如果来自不同编译器的二进制文件相互兼容,链接器如何决定链接哪个确切的库文件?

问题的动机很简单:Intel C++ 是一个优化编译器,所以如果我用它构建东西,我希望它们链接到用 Intel C++< 编译的动态库 编译器,而不是针对使用 g++ 编译的编译器。当然,我知道我可以简单地在 makefile 中使用多个条件语句来为每个使用的工具链设置带有库二进制文件的确切目录,但这有点不方便。我在徘徊,链接器是否足够智能以识别它应该使用哪个确切的共享库文件,或者它只是使用在系统 LIBRARY_PATH 中找到的第一个匹配项?

最佳答案

链接器不会知道。如果第一个找到的库不兼容,它甚至会退出,而不是搜索所有库直到找到兼容的库。

确认如下:

$ cat foo.c
int main() {
return 0;
}
$ mkdir bar
$ touch bar/libm.so
$ gcc foo.c -o foo -Lbar -lm
/usr/bin/ld: error: b/libm.so: file is empty
collect2: error: ld returned 1 exit status

otoh,动态链接的美妙之处在于能够用更好的 dylib 交换 dylib,而无需重新编译。所以你可以链接到 g++ 版本,但如果性能不佳,请在目标主机上安装 icc 版本(在 g++ 版本之前将被搜索的地方),你的应用程序将神奇地使用它(只要它们是兼容)。

您还可以在运行应用程序时使用 LD_LIBRARY_PATH 变量在非标准位置搜索库:

LD_LIBRARY_PATH=/path/to/super/libs/ ./app-dylinked-with-generic-libs

关于c++ - 链接器如何在使用不同编译器编译的动态库中选择动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12709955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com