【问题标题】:ld linker error "cpu model hidden symbol"ld 链接器错误“cpu 模型隐藏符号”
【发布时间】:2016-12-08 05:49:48
【问题描述】:

尝试在 ubuntu 16.04 上编译 sfml 程序时遇到 ld 错误。这显然是一个已知问题,应该有一个解决方法,但我不明白它是什么......

http://web.archive.org/web/20160509014317/https://gitlab.peach-bun.com/pinion/SFML/commit/3383b4a472f0bd16a8161fb8760cd3e6333f1782.patch

ld吐出的错误是

hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a(cpuinfo.o) is referenced by DSO

没有与此相关的代码 - 据我了解,如果要链接的程序包含 sf::Texturesf::Sprite 等对象,则在所有使用 g++ 5 的 ubuntu 16.04 系统上都会产生此错误。 (我不知道比这更详细的了。)

我也尝试过使用 g++ 4.9 进行编译,但出现同样的错误。

我的编译行是g++-4.9 --std=c++11 -Wall main.cpp -lsfml-graphics -lsfml-window -lsfml-system -o a.out

有其他人遇到过这个错误并成功解决了吗?

【问题讨论】:

  • 注意; C++11 支持的正确标志是-std=c++11,而不是--std=c++11。与您的问题无关,只是想我会提到它..
  • @JesperJuhl 是吗?两者似乎都有效?为什么一个比另一个更正确?双破折号版本遵循常规的 linux 命令语法。
  • 我将按照文档中的说明进行操作 - 自己尝试“man g++”并进行查找。
  • @JesperJuhl 很公平,我相信你

标签: c++ linker sfml ubuntu-16.04 g++-5


【解决方案1】:

我不得不多次解决这个问题。您可以通过编辑文件 SFML/src/SFML/Graphics/CMakeLists.txt 手动修复它,而不是应用补丁。在第 149 行,您会发现以下内容:

if(SFML_COMPILER_GCC)
 set_source_files_properties(${SRCROOT}/ImageLoader.cpp PROPERTIES COMPILE_FLAGS -fno-strict-aliasing)
endif()

在 endif() 之后,插入以下内容:

if(SFML_COMPILER_GCC AND BUILD_SHARED_LIBS)
    list(APPEND GRAPHICS_EXT_LIBS "-lgcc_s -lgcc")
endif()

然后,在顶级 SFML 文件夹中,运行以下命令:

mkdir build && cd build
cmake .. -DSFML_BUILD_EXAMPLES=ON -DSFML_BUILD_DOCS=ON
make
sudo make install
sudo ldconfig

这将在没有编译器错误的情况下构建和安装它。 (注意:如果您不想要文档或示例,请从 cmake 中删除 -D 标志)

【讨论】:

  • 这对我有用。有趣的是,示例构建得很好,例如 pong。但是当我尝试在我自己的项目中使用这些库时——即使使用精确的代码作为 pong 示例——我也遇到了这个错误。真的很奇怪 - 在一个地方它可以工作,而在另一个地方它没有相同的库。无论如何,在更改之后它在我的项目中起作用。
  • 我对这个很迷茫。已多次执行这些步骤,但仍然遇到相同的错误。 gcc 和 SFML 有什么关系?对我来说,它似乎没有任何
【解决方案2】:

我在运行标准 cmake...make 之前在 SFML 源目录中运行了这个:

curl https://gitlab.peach-bun.com/pinion/SFML/commit/3383b4a472f0bd16a8161fb8760cd3e6333f1782.patch \
  | patch -p1

这样就解决了问题

【讨论】:

    【解决方案3】:

    在尝试使用示例构建 SFML 2.4.2 时,我遇到了相同的链接器错误,特别是使用 openglshader 示例。

    受@Joshua 解决方案的启发,我尝试将编译器从 GCC 更改为 Clang。有效。

    我在这里分享是因为如果您没有限制使用 Clang,这似乎是一个更简单的解决方案。

    只需下载 SFML 并切换到其目录即可。还有……

    mkdir build && cd build
    cmake .. -DSFML_BUILD_EXAMPLES=ON -DCMAKE_CXX_COMPILER=clang++
    make
    sudo make install
    sudo ldconfig
    

    【讨论】:

      【解决方案4】:

      从编译器选项中删除 -fvisibility=hidden 对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2023-01-31
        • 2020-10-21
        • 2012-01-15
        相关资源
        最近更新 更多