0

Linuxでlibpngを動作させようとしています。netbeans で動作させることができなかったので、g++ を直接実行しg++ -lpng -lz main.cpp -o testてコンパイルしました。実行しようとすると、出力されます./test: error while loading shared libraries: libpng14.so.14: cannot open shared object file: No such file or directory。これは、動的にリンクしていて、.so ファイルが見つからないことを意味すると思います

~/Programs/NetBeansProjects/DiamondSquare$ ldd test linux-gate.so.1 => (0x008a5000) libpng14.so.14 => not found libz.so.1 => /usr/local/lib/libz.so.1 (0x00209000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0094b000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00e3a000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00927000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00220000) /lib/ld-linux.so.2 (0x00b85000)

そもそも動的にリンクしたくありませんでした。どうすればこれを解決できますか?

libpng14.so.14 が /usr/local/lib にもあることはわかっています。

ネットビーンズ内でこれを行う方法を教えていただければ、余分なポイント。

4

2 に答える 2

0

g++ がライブラリを見つけることができるのに、テストができないのは奇妙です (g++ に「-lpng」とだけ伝えても、test は特に libpn14 を想定しているため、g++ はそれを見つけることができると言えます)。-L または -R フラグを g++ に渡していませんか? g++ を実行しているシェルでは LD_PRELOAD または LD_LIBRARY_PATH 環境変数が設定されていますが、テストを実行しているシェルでは設定されていませんか? LD_PRELOAD を特定の共有ライブラリに向けて、アプリまたは g++ にその検索方法を伝えることができ、LD_LIBRARY_PATH 内のすべてのフォルダーが自動的に検索されます。

また、libpng を静的にリンクするには、「-lpng」の前に「-Wl,-Bstatic」を付けます。-Bstatic の後のライブラリは静的にリンクされることに注意してください。「-Wl,-Bdynamic -lfoo」を使用すると、動的に切り替えて、さらにいくつかのライブラリを一覧表示できます。

于 2010-09-28T18:15:27.163 に答える
0

動的リンクはデフォルトであり、一般的に優先されます。あなたは libpng が /usr/local/lib にあると言っていますが、これについて本当に肯定的ですか? /usr/local/lib/libz.so.1 が見つかります。libpng14.so.14 が /usr/local/lib にあった場合も、それが見つかるはずです。

于 2010-09-28T17:56:03.413 に答える