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

时间:2016-08-02 18:19:09

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

尝试在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

是否有其他人遇到此错误并成功解决了该问题?

4 个答案:

答案 0 :(得分:11)

我不得不多次解决这个问题。您可以通过编辑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标志)

答案 1 :(得分:2)

我在运行标准cmake...make

之前在SFML源目录中运行了它
curl https://gitlab.peach-bun.com/pinion/SFML/commit/3383b4a472f0bd16a8161fb8760cd3e6333f1782.patch \
  | patch -p1

这解决了问题

答案 2 :(得分:0)

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

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

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

只需下载SFML并切换到其目录即可。和...

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

答案 3 :(得分:0)

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