gnu链接器如何选择要链接的动态库

时间:2018-12-03 06:51:24

标签: c++ cuda g++ ld

我当时使用GPU模拟器gpgpu-sim进行研究。我自己的文件夹中有几个.so文件: My own folder

Nvidia的cudart lib文件夹中有一些替代方法.soNvidia's folder

当我键入命令时,有一些.o文件需要与libcudart.so链接:

g++ -L "Path/to/MyFolder" -l cudart *.o

我希望生成的a.out可以链接到libcudart.so,但它只是链接到一个奇怪的so文件:

    libcudart_gpgpu-sim_git-commit-6443f21d433f1b642003867e56fe1f54efae55e3_modified_0.so => not found

当我键入此代码时:

g++ -L "Path/to/NvidiaFolder" -l cudart *.o

程序可以在我的LD_LIBRARY_PATH文件夹中怀疑地找到libcudart.so.9,但它表明版本不匹配!:

./a.out: /path/to/myFolder/libcudart.so.9.0: version `libcudart.so.9.0'not found (required by ./a.out) 

有人可以告诉我ld的工作原理以及如何解决这些问题吗?

2 个答案:

答案 0 :(得分:1)

我终于找到原因了。 如果您使用以下代码链接对象以生成共享库:

g++ -shared -Wl,-soname,libNAME_A.so -o libNAME_B.so

然后,如果有人尝试使用以下方式链接NAME_B.so:

g++ <INPUT> -lNAME_B -o <OUTPUT>

输出最终将查找libNAME_A.so。

请参阅g ++手册页:

   -Wl,option
       Pass option as an option to the linker.  If option contains commas,
       it is split into multiple options at the commas.  You can use this
       syntax to pass an argument to the option.  For example,
       -Wl,-Map,output.map passes -Map output.map to the linker.  When
       using the GNU linker, you can also get the same effect with
       -Wl,-Map=output.map.

对于ld手册页:

-soname=name
       When creating an ELF shared object, set the internal DT_SONAME
       field to the specified name.  When an executable is linked with a
       shared object which has a DT_SONAME field, then when the executable
       is run the dynamic linker will attempt to load the shared object
       specified by the DT_SONAME field rather than the using the file
       name given to the linker.

答案 1 :(得分:-1)

与CUDA无关,这只是链接和运行时环境设置问题。

ld链接器按照-L选项参数指定的顺序搜索对象和库归档文件,并且仅在进入默认系统目录之后才进行搜索。链接器将链接与该搜索最匹配的目标代码。

在运行时,如果链接到动态库(.so文件),则需要正确定义LD_LIBRARY_PATH环境变量,并使用路径列表查找动态库,并用冒号(:)分隔。

因此,如果您使用本地路径中的库链接到对象(假设您正在寻找libcudart.so):

g++  -o myprogram *.o -L "/Path/to/myFolder" -lcudart

在运行程序之前,您需要按照以下步骤设置LD_LIBRARY_PATH:

export LD_LIBRARY_PATH="/Path/to/myFolder:$LD_LIBRARY_PATH"
./myprogram

我希望这会有所帮助,并澄清您的理解。坦白说,我不了解您的libcudart_gpgpu-sim_git-commit匹配的来源