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 文件

~/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 中执行此操作,请加分。

4

2 回答 2

0

动态链接是默认设置,通常应该首选。你说 libpng 在 /usr/local/lib 中,你真的对此持肯定态度吗?它找到 /usr/local/lib/libz.so.1。如果 libpng14.so.14 在 /usr/local/lib 中,它也应该找到它。

于 2010-09-28T17:56:03.413 回答
0

奇怪的是 g++ 能够找到该库但 test 不能(您可以说 g++ 可以找到它,因为即使您只告诉 g++ '-lpng',测试也特别期望 libpn14)。您确定没有将任何 -L 或 -R 标志传递给 g++ 吗?您的 LD_PRELOAD 或 LD_LIBRARY_PATH 环境变量是否设置在您运行 g++ 的 shell 中,但未设置在您运行测试的 shell 中?您可以将 LD_PRELOAD 指向特定的共享库,以告诉应用程序或 g++ 如何找到它,并且会自动搜索 LD_LIBRARY_PATH 中的任何文件夹。

还要静态链接 libpng 将“-Wl,-Bstatic”放在“-lpng”之前。请注意, -Bstatic 之后的任何库都将被静态链接。您可以使用“-Wl,-Bdynamic -lfoo”切换回动态并列出更多库。

于 2010-09-28T18:15:27.163 回答