当LD_LIBRARY_PATH包含32位和64位版本的路径时,如何指定要使用的正确库

时间:2012-08-30 07:04:41

标签: c++ linux g++

我在linux机器上写了一个小的c ++项目。我能够使用-I和_L,-l命令正确编译和链接代码。

我在网上读到,在运行代码时,我们需要在LD_LIBRARY_PATH变量中找到.so文件的路径。现在我使用的框是64位,还有另一个使用32位版本库的应用程序。因此LD_LIBRARY_PATH具有指向两个版本库的路径。

当我尝试运行我的应用程序时,例如。 ./xyz arg1 arg2,我收到以下错误

./DaemonCpp: error while loading shared libraries: libldap.so: wrong ELF class: ELFCLASS32

我认为这是因为它试图加载32位版本而不是64位版本。我尝试更改LD_LIBRARY_PATH中提到路径的顺序,使得64位的路径首先出现但仍然出现此错误。有没有办法可以指示应用程序使用64位版本的库。

作为我的主要问题的第二个问题,当我们链接c ++代码时,我们使用-l使用-L和库名称指定库路径。然后它应该知道当我运行可执行文件时使用哪个库,我不应该首先得到这个错误

1 个答案:

答案 0 :(得分:1)

在回答第二个问题时,您只使用-L指定了链接时间路径。您还需要为使​​用-rpath=<path>指定的每个路径添加-L。让它看一下运行时间。

如果您使用gcc / g ++驱动程序进行链接,那么您应该使用-Wl,-rpath=<path>

e.g。 {lib}中的库libfoo.so:

/opt/libs/lib64

在回答您的第一个问题时,如果gcc -o test test.o -L/opt/libs/lib64 -Wl,-rpath=/opt/libs/lib64 -lfoo 导致问题,那么您的第一个停靠点是LD_LIBRARY_PATH,它显示了在运行时链接的库的路径。从一个空字符串开始,然后从那里开始工作。

第三,如果需要设置ldd的原因是因为/ opt / lib等中有库...那么您应该将这些路径添加到LD_LIBRARY_PATH并使用{ {1}}更新这些库的搜索地图。这通常可以使您免于需要/etc/ld.so.conf变量。