【问题标题】:Linking libpng with g++将 libpng 与 g++ 链接
【发布时间】:2011-04-18 10:49:44
【问题描述】:

我正在尝试让 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中做到这一点,加分。

【问题讨论】:

    标签: c++ g++ libpng


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      奇怪的是 g++ 能够找到库但 test 不能(你可以说 g++ 可以找到它,因为 test 特别期望 libpn14,即使你只告诉 g++ '-lpng')。您确定没有将任何 -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”切换回动态并列出更多库。

      【讨论】:

      • g++ -I/usr/local/include/libpng14 -L/usr/local/lib -lpng -lz main.cpp -o test 现在似乎可以解决问题。我会调查你所说的。
      猜你喜欢
      • 2012-09-19
      • 2011-05-02
      • 2011-01-24
      • 2011-02-19
      • 2018-04-13
      • 2012-02-19
      • 1970-01-01
      • 2015-01-09
      • 2023-01-14
      相关资源
      最近更新 更多