2010-09-28 58 views
0

我試圖讓libpng在linux上工作。我無法通過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文件鏈接libpng與g ++

~/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中,如果這很重要的話。

如果您能告訴我如何在netbeans中執行此操作,請多加註意。

回答

0

奇怪的是,g ++能夠找到庫,但測試不能(你可以告訴g ++可以找到它,因爲即使只告訴g ++'-lpng',測試特別期望libpn14)。你確定你沒有將任何-L或-R標誌傳遞給g ++嗎?您的LD_PRELOAD或LD_LIBRARY_PATH環境變量是在您運行g ++的shell中設置的,而不是在您正在運行的shell中進行測試的?您可以將LD_PRELOAD指向特定的共享庫,以告訴應用程序或g ++如何找到它,並自動搜索LD_LIBRARY_PATH中的任何文件夾。

還要在「-lpng」之前靜態鏈接libpng放置「-Wl,-Bstatic」。請注意,-Bstatic之後的任何庫都將靜態鏈接。您可以切換回動態並使用「-Wl,-Bdynamic -lfoo」列出更多庫。

+0

'g ++ -I/usr/local/include/libpng14 -L/usr/local/lib -lpng -lz main.cpp -o test'現在似乎已經成功了。生病看看你說什麼。 – Kyle 2010-09-28 19:24:09

0

動態鏈接是默認設置,通常應該首選。你說libpng位於/ usr/local/lib中,你對此有正面評價嗎?它找到/usr/local/lib/libz.so.1。如果libpng14.so.14在/ usr/local/lib中,它也應該找到它。