Linux 二进制文件无法找到 -rpath 设置为 $ORIGIN 的本地共享库

问题描述 投票:0回答:1

在过去的几个月里,我一直在使用 C++ 和 SDL2(图形库)制作游戏。游戏现在已经完成了,我想发布它。 Windows 构建似乎工作正常,但我在为 Linux 构建它时遇到了问题。由于 SDL2(和负责文本渲染的 SDL2_ttf)不是标准库,因此我将 .so 文件与二进制文件一起发送并动态链接到它们,但是当我在另一个 Linux 系统(未安装 SD2_ttf)上运行该应用程序时,程序不启动。当我在二进制文件上运行“readelf -d”命令时,它显示运行路径确实是 $ORIGIN,但“ldd”命令告诉我找不到库。我已经寻找解决方案好几天了,但我不明白我做错了什么。 我在 Linux Mint 上用 vscode 编写了这个程序,如果这有什么不同的话。

tasks.json:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-no-pie",
                "-static-libstdc++",
                "-static-libgcc",
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-Wl,-R,'$ORIGIN'",
                "-lSDL2main",
                "-lSDL2",
                "-lSDL2_ttf"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

全新 Linux Mint 安装(在虚拟机中运行)上 ldd 输出的前几行。 SDL2 似乎默认包含在 Linux Mint 中,但 SDL2_ttf 不是,我宁愿从应用程序文件夹加载这些库:

linux-vdso.so.1 (0x00007ffc82c52000)
libSDL2-2.0.so.0 => /lib/x86_64-linux-gnu/libSDL2-2.0.so.0 (0x00007f696c4ff000)
libSDL2_ttf-2.0.so.0 => not found

readelf -d 输出:


Dynamic section at offset 0x11ed98 contains 28 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libSDL2-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libSDL2_ttf-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]
 0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN]
 0x000000000000000c (INIT)               0x404000
 0x000000000000000d (FINI)               0x4d96c8
 0x0000000000000019 (INIT_ARRAY)         0x518890
 0x000000000000001b (INIT_ARRAYSZ)       72 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x5188d8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x4003e8
 0x0000000000000005 (STRTAB)             0x4014d8
 0x0000000000000006 (SYMTAB)             0x400410
 0x000000000000000a (STRSZ)              2182 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x520000
 0x0000000000000002 (PLTRELSZ)           4080 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x402040
 0x0000000000000007 (RELA)               0x401f98
 0x0000000000000008 (RELASZ)             168 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x401ec8
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x401d5e
 0x0000000000000000 (NULL)               0x0


游戏文件夹内容: Game folder

c++ linux gcc sdl-2 sdl-ttf
1个回答
0
投票

正如 amonakov 指出的,我的 .so 文件的名称末尾包含 .18.0,因此链接器找不到它。如果有人有同样的问题,请检查一下。

© www.soinside.com 2019 - 2024. All rights reserved.