我是Ubuntu的新手,并且正在Amazon EC2云中运行Ubuntu。
我正在尝试在Ubuntu框(cppunit
和i386
)上编译amd64
,但它不会链接到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
“正常” 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
答案 0 :(得分:3)
我也在64位ubuntu,gcc 4.6.3上碰到了这个,我的预感是链接lib的排序。但是,同样的事情建立在32位。 我在链接命令的末尾添加了-ldl并将其链接,因此看起来像某种链接器问题。 你也可以在shell中设置env var:LIBS = -ldl,它将构建。
答案 1 :(得分:1)
因为ld.so.conf用于动态链接器,而不是后装配链接器ld(1)。有人创建了这个新路径,但没有更新链接器搜索的目录。对于libdl,/ lib64或/ usr / lib64中应该有一个链接,或链接器搜索链接64位对象的路径之一。
这个(新路径)是另一个例子,从我的PoV,到各种Linux发行版所做的随机变化,而没有完全理解后果或历史。