我在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和库名称指定库路径。然后它应该知道当我运行可执行文件时使用哪个库,我不应该首先得到这个错误
答案 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
变量。