ld链接器错误 "CPU模型隐藏符号"

12

我在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

据我了解,这与相关代码无关。在 Ubuntu 16.04 系统中,如果待链接的程序包含诸如 sf::Texturesf::Sprite 等对象,则会出现此错误。(我不知道比这更详细的信息。)

我已尝试使用 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。虽然与您的问题无关,但我想提一下。 - Jesper Juhl
@JesperJuhl 是吗?两者都可以工作?为什么一个比另一个更正确?双破折号版本遵循常规的Linux命令语法。 - FreelanceConsultant
我会按照文档所述去做 - 你可以自己尝试一下"man g++"并查找相关信息。 - Jesper Juhl
@JesperJuhl 好的,我相信你的话。 - FreelanceConsultant
4个回答

11

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

我曾多次遇到这个问题。如果不想使用补丁,你可以手动编辑文件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示例完全相同的代码 - 我仍然会遇到此错误。真的很奇怪 - 在一个地方它可以工作,在另一个地方却不能。无论如何,在进行了那个更改之后,它在我的项目中可以工作了。 - solgar
1
我对这个问题感到很困惑。已经按照这些步骤多次操作,但仍然出现相同的错误。gcc和SFML之间有什么关联吗?对我来说似乎没有任何关系。 - Robin Castlin

2

在运行标准的cmake...make之前,我在SFML源代码目录中运行了这个命令:

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

并且这解决了问题。


0

我在尝试编译包含 openglshader 示例的SFML 2.4.2时遇到了相同的链接错误。

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

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

只需下载SFML并转到其目录即可…

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接