1

私は Ubuntu を初めて使用し、Amazon EC2 クラウドで Ubuntu を実行しています。

cppunitUbuntuボックス(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

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 を追加してリンクしたので、何らかのリンカの問題のようです。シェルから env var: LIBS=-ldl を設定することもでき、ビルドされます。

于 2012-07-25T16:46:46.323 に答える
1

ld.so.conf は、アセンブリ後のリンカーである ld(1) ではなく、ダイナミック リンカー用であるためです。誰かがこの新しいパスを作成しましたが、リンカーが検索するディレクトリを更新していません。/lib64 または /usr/lib64 に libdl のリンク、またはリンカーが 64 ビット オブジェクトをリンクするために検索するパスの 1 つが必要です。

これ (新しいパス) は、結果や履歴を完全に理解せずにさまざまな Linux ディストリビューションが行うランダムな変更の、私の PoV からの別の例です。

于 2013-01-28T21:18:35.137 に答える