0

我在 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 指定库名称。然后它应该知道在我运行可执行文件时要使用哪个库,而且我一开始就不应该遇到这个错误

4

1 回答 1

1

在回答您的第二个问题时,您仅用于-L指定链接时间路径。您还需要为-rpath=<path>您指定的每个路径添加-L. 让它也查看运行时。

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

例如库 libfoo.so 在/opt/libs/lib64

gcc -o test test.o -L/opt/libs/lib64 -Wl,-rpath=/opt/libs/lib64 -lfoo

在回答您的第一个问题时,如果LD_LIBRARY_PATH导致问题,那么您的第一个调用端口是ldd显示在运行时链接的库的路径。从一个空字符串开始,然后从那里开始。

第三,如果LD_LIBRARY_PATH需要设置的原因是因为 /opt/lib 中有库等......那么您应该将这些路径添加到您的/etc/ld.so.confldconfig用于更新这些库的搜索地图。这通常会使您LD_LIBRARY_PATH根本不需要该变量。

于 2012-08-30T07:18:55.280 回答