代码之家  ›  专栏  ›  技术社区  ›  Anonymous Person

C++linux可执行文件一直试图使用不存在的库

  •  1
  • Anonymous Person  · 技术社区  · 7 年前

    我试图在Linux上用GLFW编写一个简单的应用程序。现在,主文件(唯一的文件)基本上只是几行代码,以确保动态库链接正确。这是:

    #include <GLFW/glfw3.h>
    #include <iostream>
    
    int main()
    {
        glfwInit();
        std::cout << "It works this far!" << std::endl;
        glfwTerminate();
    }
    

    包含文件存储在标有“include”的目录中,库文件存储在带有“lib”标签的目录中。截至目前,我正在用以下代码编译程序:

    g++ -Wl,-Rlib -Iinclude -Llib test.cpp -o test -lglfw.3.2
    

    ./test: error while loading shared libraries: libglfw.so.3: cannot open shared object file: No such file or directory
    

    现在,在你们匆忙否决这个问题并将其标记为重复之前,至少请允许我解释一下为什么我认为我的问题不同到不能重复。 我已经尝试了其他问题提出的解决方案,但没有成功。如您所见,我在与 -Wl,-Rlib

    ldd

    libglfw.so.3 => not found
    

    出于某种原因,它坚持寻找 libglfw.so.3 。它不会有任何其他方式。 从重命名库时 libglfw.3.2.so libglfw.so.3 ,程序运行良好并打印出来 It works this far!

    为什么会发生这种情况?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Martin Rosenau    7 年前

    ELF可执行文件包含 准确的 使用的动态库的名称。

    libglfw.so.3

    文件命名方案有意以一种方式进行,即不将“完整”版本编码到文件名中:这种方式是更新版本(“ libglfw.so.3.15 )将与可执行文件一起工作。

    libglfw.so.3 -&燃气轮机; libglfw.so.3.2

    编辑

    libglfw.3.2.so libglfw.so.3 ?

    答案与安装新版本库时的向后兼容性有关:

    -lglfw libglfw.so 是向上看的。

    libglfw.so 在可执行文件和新的不兼容版本中( libglfw.so.4

    通过让两个版本的库都安装库的“真实”符号链接名来实现向后兼容性( )必须存储在可执行文件中。

    您会发现一些文件希望自己存储为的信息 libglfw.so.3 .

    -lglfw )比存储在库中的名称更不“精确”。

        2
  •  1
  •   ldav1s    7 年前

    这是描述的共享库的Linux约定 here 在其他地方。对于Linux libfoo.so.x.y.z libfoo.so.x .通常在安装共享库时(例如通过rpm、dpkg等),会调用 ldconfig 这样,刚安装的库就有了一个符号链接,该符号链接遵循了引用该库的约定。此外,出于性能原因,这些LIB(如果安装到“受信任的位置”)会添加到链接器缓存中。

    /test:加载共享库时出错:libglfw.so。3: 无法打开共享对象文件:没有此类文件或目录

    libglfw.so.3 ld-linux.so 的路径。

    如您所见,在与-Wl,-Rlib链接期间,我尝试设置库的路径

    还是找不到-- libglfw.so.3 动态连接器

    ldconfig -n /path/to/lib
    

    输出所需的 libglfw.so.3

    我还尝试将LD\u LIBRARY\u PATH设置为指向我的库的位置

    libglfw.so.3 没有打开 动态连接器