g++链接问题
我遇到了一个奇怪的链接问题,并且我才开始使用 c++ 编程,所以我不太确定这意味着什么...
main.cpp
#include <iostream>
main(void)
{
return 0;
}
编译
esr@athena:~/programming/cpp$ g++ main.cpp
esr@athena:~/programming/cpp$ ./a.out
esr@athena:~/programming/cpp$ g++ main.cpp -L/home/esr/ogre/lib -lOgreMain
esr@athena:~/programming/cpp$ ./a.out
这执行得很好但是,当我链接到同一文件夹中的另一个库时......
esr@athena:~/programming/cpp$ g++ main.cpp -L/home/esr/ogre/lib -lOgreMain -lOgreTerrain
esr@athena:~/programming/cpp$ ./a.out
./a.out: error while loading shared libraries: libOgreTerrain.so.1.7.1: cannot open shared object file: No such file or directory
那么该文件夹中有什么?
esr@athena:~/programming/cpp$ ls /home/esr/ogre/lib/
libOgreMain.so Sample_DynTex.so
libOgreMain.so.1.7.1 Sample_FacialAnimation.so
libOgrePaging.so Sample_Fresnel.so
libOgrePaging.so.1.7.1 Sample_Grass.so
libOgreRTShaderSystem.so Sample_Instancing.so
libOgreRTShaderSystem.so.1.7.1 Sample_Isosurf.so
libOgreTerrain.so Sample_Lighting.so
***libOgreTerrain.so.1.7.1*** Sample_Ocean.so
编辑:(星星是为了强调,而不是文件名) 就在那里!关于我做错了什么有什么想法吗?
编辑
仍有问题。尝试链接 libOgreTerrain 的所有依赖项,但这似乎并不能满足编译器的要求。
ldd libOgreTerrain.so
linux-vdso.so.1 => (0x00007fff56bff000)
libOgreMain.so.1.7.1 => /home/esr/ogre/lib/libOgreMain.so.1.7.1 (0x00007fd3584c8000)
libOgrePaging.so.1.7.1 => /home/esr/ogre/lib/libOgrePaging.so.1.7.1 (0x00007fd35829b000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fd357fee000)
libSM.so.6 => /usr/lib/libSM.so.6 (0x00007fd357de5000)
libICE.so.6 => /usr/lib/libICE.so.6 (0x00007fd357bca000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fd357893000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007fd357681000)
libXt.so.6 => /usr/lib/libXt.so.6 (0x00007fd35741c000)
libXaw.so.7 => /usr/lib/libXaw.so.7 (0x00007fd3571ac000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fd356f8f000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fd356d8b000)
libfreeimage.so.3 => /usr/lib/libfreeimage.so.3 (0x00007fd3568bc000)
libzzip-0.so.13 => /usr/lib/libzzip-0.so.13 (0x00007fd3566b5000)
libz.so.1 => /lib/libz.so.1 (0x00007fd35649d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fd356196000)
libm.so.6 => /lib/libm.so.6 (0x00007fd355f13000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fd355cfd000)
libc.so.6 => /lib/libc.so.6 (0x00007fd355979000)
libuuid.so.1 => /lib/libuuid.so.1 (0x00007fd355774000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fd355556000)
libXmu.so.6 => /usr/lib/libXmu.so.6 (0x00007fd35533d000)
libXpm.so.4 => /usr/lib/libXpm.so.4 (0x00007fd35512c000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fd354f28000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fd354d22000)
将编译代码更改为以下内容:
g++ main.cpp -L/home/esr/ogre/lib -lOgreMain -lOgreTerrain -L/lib -L/usr/lib -lfreetype -lSM -lICE -lX11 -lXext -lXt -lXaw -lpthread -lfreeimage -lxcb -lXmu -lXpm -lXau -lXdmcp -ldl -lzzip -lz -lstdc++ -lm -lgcc_s -lc
据我所知,它链接了所有依赖项(uuid 不会链接)。
esr@athena:~/programming/cpp$ g++ main.cpp -L/home/esr/ogre/lib -lOgreMain -lOgreTerrain -L/lib -L/usr/lib -lfreetype -lSM -lICE -lX11 -lXext -lXt -lXaw -lpthread -lfreeimage -lxcb -lXmu -lXpm -lXau -lXdmcp -ldl -lzzip -lz -lstdc++ -lm -lgcc_s -lc
esr@athena:~/programming/cpp$ ./a.out
./a.out: error while loading shared libraries: libOgreTerrain.so.1.7.1: cannot open shared object file: No such file or directory
esr@athena:~/programming/cpp$ LD_LIBRARY_PATH=/home/esr/ogre/lib ./a.out
esr@athena:~/programming/cpp$
编辑 2
的链接
esr@athena:~/programming/cpp$ ldd a.out
linux-vdso.so.1 => (0x00007fff978a4000)
libOgreMain.so.1.7.1 => /usr/lib/libOgreMain.so.1.7.1 (0x00007f612d528000)
libOgreTerrain.so.1.7.1 => not found
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f612d2a0000)
libSM.so.6 => /usr/lib/libSM.so.6 (0x00007f612d097000)
libICE.so.6 => /usr/lib/libICE.so.6 (0x00007f612ce7c000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f612cb45000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f612c933000)
libXt.so.6 => /usr/lib/libXt.so.6 (0x00007f612c6ce000)
libXaw.so.7 => /usr/lib/libXaw.so.7 (0x00007f612c45e000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f612c241000)
libfreeimage.so.3 => /usr/lib/libfreeimage.so.3 (0x00007f612bd73000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f612bb55000)
libXmu.so.6 => /usr/lib/libXmu.so.6 (0x00007f612b93c000)
libXpm.so.4 => /usr/lib/libXpm.so.4 (0x00007f612b72b000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f612b527000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f612b321000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f612b11d000)
libzzip-0.so.13 => /usr/lib/libzzip-0.so.13 (0x00007f612af15000)
libz.so.1 => /lib/libz.so.1 (0x00007f612acfd000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f612a9f7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f612a7e0000)
libm.so.6 => /lib/libm.so.6 (0x00007f612a55d000)
libc.so.6 => /lib/libc.so.6 (0x00007f612a1da000)
libuuid.so.1 => /lib/libuuid.so.1 (0x00007f6129fd4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f612dcfc000)
a.out分辨率
因此部分解决,我链接到 /usr/lib 文件夹中的共享库,我不确定为什么 g++ 不会在那里查找,但它就是不会。
I'm having a weird linking problem and am only beginning programming with c++ so I'm not terribly sure what it means...
main.cpp
#include <iostream>
main(void)
{
return 0;
}
Compiling
esr@athena:~/programming/cpp$ g++ main.cpp
esr@athena:~/programming/cpp$ ./a.out
esr@athena:~/programming/cpp$ g++ main.cpp -L/home/esr/ogre/lib -lOgreMain
esr@athena:~/programming/cpp$ ./a.out
This executes just fine, however, when I link against another of the libraries in the same folder...
esr@athena:~/programming/cpp$ g++ main.cpp -L/home/esr/ogre/lib -lOgreMain -lOgreTerrain
esr@athena:~/programming/cpp$ ./a.out
./a.out: error while loading shared libraries: libOgreTerrain.so.1.7.1: cannot open shared object file: No such file or directory
So what's in that folder?
esr@athena:~/programming/cpp$ ls /home/esr/ogre/lib/
libOgreMain.so Sample_DynTex.so
libOgreMain.so.1.7.1 Sample_FacialAnimation.so
libOgrePaging.so Sample_Fresnel.so
libOgrePaging.so.1.7.1 Sample_Grass.so
libOgreRTShaderSystem.so Sample_Instancing.so
libOgreRTShaderSystem.so.1.7.1 Sample_Isosurf.so
libOgreTerrain.so Sample_Lighting.so
***libOgreTerrain.so.1.7.1*** Sample_Ocean.so
Edit: (the stars are for emphasis, not a file name)
It's right there! Any ideas on what I'm doing wrong?
Edit
Still having problems. Tried linking against all dependencies of libOgreTerrain and that doesn't seem to have satisfied the compiler.
ldd libOgreTerrain.so
linux-vdso.so.1 => (0x00007fff56bff000)
libOgreMain.so.1.7.1 => /home/esr/ogre/lib/libOgreMain.so.1.7.1 (0x00007fd3584c8000)
libOgrePaging.so.1.7.1 => /home/esr/ogre/lib/libOgrePaging.so.1.7.1 (0x00007fd35829b000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fd357fee000)
libSM.so.6 => /usr/lib/libSM.so.6 (0x00007fd357de5000)
libICE.so.6 => /usr/lib/libICE.so.6 (0x00007fd357bca000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fd357893000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007fd357681000)
libXt.so.6 => /usr/lib/libXt.so.6 (0x00007fd35741c000)
libXaw.so.7 => /usr/lib/libXaw.so.7 (0x00007fd3571ac000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fd356f8f000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fd356d8b000)
libfreeimage.so.3 => /usr/lib/libfreeimage.so.3 (0x00007fd3568bc000)
libzzip-0.so.13 => /usr/lib/libzzip-0.so.13 (0x00007fd3566b5000)
libz.so.1 => /lib/libz.so.1 (0x00007fd35649d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fd356196000)
libm.so.6 => /lib/libm.so.6 (0x00007fd355f13000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fd355cfd000)
libc.so.6 => /lib/libc.so.6 (0x00007fd355979000)
libuuid.so.1 => /lib/libuuid.so.1 (0x00007fd355774000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fd355556000)
libXmu.so.6 => /usr/lib/libXmu.so.6 (0x00007fd35533d000)
libXpm.so.4 => /usr/lib/libXpm.so.4 (0x00007fd35512c000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fd354f28000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fd354d22000)
Changed compilation code to the following:
g++ main.cpp -L/home/esr/ogre/lib -lOgreMain -lOgreTerrain -L/lib -L/usr/lib -lfreetype -lSM -lICE -lX11 -lXext -lXt -lXaw -lpthread -lfreeimage -lxcb -lXmu -lXpm -lXau -lXdmcp -ldl -lzzip -lz -lstdc++ -lm -lgcc_s -lc
Which links against all dependencies as above afaik (uuid wouldn't link).
esr@athena:~/programming/cpp$ g++ main.cpp -L/home/esr/ogre/lib -lOgreMain -lOgreTerrain -L/lib -L/usr/lib -lfreetype -lSM -lICE -lX11 -lXext -lXt -lXaw -lpthread -lfreeimage -lxcb -lXmu -lXpm -lXau -lXdmcp -ldl -lzzip -lz -lstdc++ -lm -lgcc_s -lc
esr@athena:~/programming/cpp$ ./a.out
./a.out: error while loading shared libraries: libOgreTerrain.so.1.7.1: cannot open shared object file: No such file or directory
esr@athena:~/programming/cpp$ LD_LIBRARY_PATH=/home/esr/ogre/lib ./a.out
esr@athena:~/programming/cpp$
Edit 2
Linking of a.out
esr@athena:~/programming/cpp$ ldd a.out
linux-vdso.so.1 => (0x00007fff978a4000)
libOgreMain.so.1.7.1 => /usr/lib/libOgreMain.so.1.7.1 (0x00007f612d528000)
libOgreTerrain.so.1.7.1 => not found
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f612d2a0000)
libSM.so.6 => /usr/lib/libSM.so.6 (0x00007f612d097000)
libICE.so.6 => /usr/lib/libICE.so.6 (0x00007f612ce7c000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f612cb45000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f612c933000)
libXt.so.6 => /usr/lib/libXt.so.6 (0x00007f612c6ce000)
libXaw.so.7 => /usr/lib/libXaw.so.7 (0x00007f612c45e000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f612c241000)
libfreeimage.so.3 => /usr/lib/libfreeimage.so.3 (0x00007f612bd73000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f612bb55000)
libXmu.so.6 => /usr/lib/libXmu.so.6 (0x00007f612b93c000)
libXpm.so.4 => /usr/lib/libXpm.so.4 (0x00007f612b72b000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f612b527000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f612b321000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f612b11d000)
libzzip-0.so.13 => /usr/lib/libzzip-0.so.13 (0x00007f612af15000)
libz.so.1 => /lib/libz.so.1 (0x00007f612acfd000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f612a9f7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f612a7e0000)
libm.so.6 => /lib/libm.so.6 (0x00007f612a55d000)
libc.so.6 => /lib/libc.so.6 (0x00007f612a1da000)
libuuid.so.1 => /lib/libuuid.so.1 (0x00007f6129fd4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f612dcfc000)
Resolution
Partially resolved thusly, I linked to the shared libraries in the /usr/lib folder, I'm not sure why g++ wouldn't look in there, but it just wouldn't.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这很简单。
操作系统在 ldconfig 中存在的目录中查找库。
似乎 libOgreTerrain.so 链接到一些未明确指定的其他库。
首先尝试一下:
您可以显示动态链接路径,如下所示:
It's rather simple.
The OS looks for libraries in the directories that exist in the ldconfig.
it seems that libOgreTerrain.so links against some other libraries that were not explicitly specified.
Try this first:
You can display dynamic linking paths like that: