g++链接问题

发布于 2024-09-30 02:23:35 字数 5945 浏览 1 评论 0原文

我遇到了一个奇怪的链接问题,并且我才开始使用 c++ 编程,所以我不太确定这意味着什么...

ma​​in.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.

Useful links here and here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

街角卖回忆 2024-10-07 02:23:35

这很简单。

操作系统在 ldconfig 中存在的目录中查找库。

似乎 libOgreTerrain.so 链接到一些未明确指定的其他库。

首先尝试一下:

LD_LIBRARY_PATH=/home/esr/ogre/lib ./a.out

您可以显示动态链接路径,如下所示:

ldd ./a.out

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:

LD_LIBRARY_PATH=/home/esr/ogre/lib ./a.out

You can display dynamic linking paths like that:

ldd ./a.out
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文