1

我是 Ubuntu 新手,正在 Amazon EC2 云中运行 Ubuntu。

我正在尝试cppunit在 Ubuntu 框(i386amd64)上编译,它不会链接到libdl

g++ -g -O2 -o .libs/DllPlugInTester DllPlugInTester.o CommandLineParser.o  -ldl ../../src/cppunit/.libs/libcppunit.so -lm  -Wl,--rpath -Wl,/home/ubuntu/cppunit/lib
../../src/cppunit/.libs/libcppunit.so: undefined reference to `dlsym'
../../src/cppunit/.libs/libcppunit.so: undefined reference to `dlopen'
../../src/cppunit/.libs/libcppunit.so: undefined reference to `dlclose'

现在我不明白libdl.so存在且正确:

ubuntu@domU-12-31-39-0A-98-1A:~/cppunit$ ls /lib/i386-linux-gnu/libdl*
/lib/i386-linux-gnu/libdl-2.15.so  /lib/i386-linux-gnu/libdl.so.2

但是whereis什么都没有:

ubuntu@domU-12-31-39-0A-98-1A:~/cppunit$ whereis libdl
libdl:

libc6已安装:

ubuntu@domU-12-31-39-0A-98-1A:~/cppunit$ sudo apt-get install libc6
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libc6 is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

那么为什么我的构建找不到呢?

uname -r是_3.2.0-25-virtual

Fedora 上的“正常” whereis如下所示:

[matt cppunit] whereis libdl
libdl: /lib/libdl.so /usr/lib/libdl.so /lib64/libdl.so /usr/lib64/libdl.so

有任何想法吗?

编辑:我/etc/ld.so.conf.d/*.conf似乎很明智:

ubuntu@domU-12-31-39-0A-98-1A:~$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/i386-linux-gnu/mesa
# Multiarch support
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
# libc default configuration
/usr/local/lib
# This directive teaches ldconfig to search in nosegneg subdirectories
# and cache the DSOs there with extra bit 1 set in their hwcap match
# fields. In Xen guest kernels, the vDSO tells the dynamic linker to
# search in nosegneg subdirectories and to match this extra hwcap bit
# in the ld.so.cache file.
hwcap 1 nosegneg
4

2 回答 2

4

我也在 64 位 ubuntu,gcc 4.6.3 上遇到了这个问题,我的直觉是链接库的排序。但是,同样的事情建立在 32 位上。我在链接命令的末尾添加了 -ldl 并链接了它,所以看起来像是某种链接器问题。您还可以从 shell 设置 env var: LIBS=-ldl,它会构建。

于 2012-07-25T16:46:46.323 回答
1

因为 ld.so.conf 用于动态链接器,而不是后组装链接器,ld(1)。有人创建了这个新路径,但没有更新链接器搜索的目录。/lib64 或 /usr/lib64 中应该有 libdl 的链接,或者链接器搜索链接 64 位对象的路径之一。

这条(新路径)是另一个例子,来自我的 PoV,各种 Linux 发行版在不完全了解后果或历史的情况下进行的随机更改。

于 2013-01-28T21:18:35.137 回答