我正在尝试让libpng在linux上工作。我无法通过netbeans工作,所以我直接以g++ -lpng -lz main.cpp -o test
运行g ++并编译。当我尝试运行它时,它会输出./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中,如果重要的话。
如果您可以告诉我如何在netbeans中执行此操作,请加分。
答案 0 :(得分:0)
动态链接是默认设置,通常应该是首选。你说libpng在/ usr / local / lib中,你对此真的很肯定吗?它找到/usr/local/lib/libz.so.1。如果libpng14.so.14在/ usr / local / lib中,它也应该找到它。
答案 1 :(得分:0)
奇怪的是,g ++能够找到库,但测试不能(你可以告诉g ++可以找到它,因为测试特别期望libpn14,即使你只告诉g ++'-lpng')。你确定你没有将任何-L或-R标志传递给g ++吗?您的运行g ++的shell中是否设置了LD_PRELOAD或LD_LIBRARY_PATH环境变量,而不是在运行test的shell中?您可以将LD_PRELOAD指向特定的共享库以告知应用程序或g ++如何查找它,并自动搜索LD_LIBRARY_PATH中的所有文件夹。
另外要链接libpng静态地将“-Wl,-Bstatic”放在“-lpng”之前。请注意,-Bstatic之后的任何库都将静态链接。您可以使用“-Wl,-Bdynamic -lfoo”切换回动态并列出更多库。