C++ ld链接器错误“;cpu型号隐藏符号“;
在ubuntu 16.04上编译sfml程序时,我遇到了一个ld错误。这显然是一个已知的问题,应该有一个解决办法,但我不明白它是什么 ld发出的错误是C++ ld链接器错误“;cpu型号隐藏符号“;,c++,linker,sfml,ubuntu-16.04,g++-5,C++,Linker,Sfml,Ubuntu 16.04,G++ 5,在ubuntu 16.04上编译sfml程序时,我遇到了一个ld错误。这显然是一个已知的问题,应该有一个解决办法,但我不明白它是什么 ld发出的错误是 hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a(cpuinfo.o) is referenced by DSO 没有与此相关的代码-据我所知,如果要链接的程序包含诸如sf::Texture和sf::Sprite之类的对象,则在所有使用g++5的
hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a(cpuinfo.o) is referenced by DSO
没有与此相关的代码-据我所知,如果要链接的程序包含诸如sf::Texture
和sf::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
是否有其他人遇到此错误并成功解决了此问题?我已多次修复此问题。您可以通过编辑文件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()
if(SFML_COMPILER_GCC AND BUILD_SHARED_LIBS)
list(APPEND GRAPHICS_EXT_LIBS "-lgcc_s -lgcc")
endif()
mkdir build && cd build
cmake .. -DSFML_BUILD_EXAMPLES=ON -DSFML_BUILD_DOCS=ON
make
sudo make install
sudo ldconfig
在endif()之后插入以下内容:
if(SFML_COMPILER_GCC)
set_source_files_properties(${SRCROOT}/ImageLoader.cpp PROPERTIES COMPILE_FLAGS -fno-strict-aliasing)
endif()
if(SFML_COMPILER_GCC AND BUILD_SHARED_LIBS)
list(APPEND GRAPHICS_EXT_LIBS "-lgcc_s -lgcc")
endif()
mkdir build && cd build
cmake .. -DSFML_BUILD_EXAMPLES=ON -DSFML_BUILD_DOCS=ON
make
sudo make install
sudo ldconfig
然后,在顶级SFML文件夹中,运行以下操作:
if(SFML_COMPILER_GCC)
set_source_files_properties(${SRCROOT}/ImageLoader.cpp PROPERTIES COMPILE_FLAGS -fno-strict-aliasing)
endif()
if(SFML_COMPILER_GCC AND BUILD_SHARED_LIBS)
list(APPEND GRAPHICS_EXT_LIBS "-lgcc_s -lgcc")
endif()
mkdir build && cd build
cmake .. -DSFML_BUILD_EXAMPLES=ON -DSFML_BUILD_DOCS=ON
make
sudo make install
sudo ldconfig
这将在没有编译器错误的情况下构建和安装它。(注意:如果不需要文档或示例,请从cmake中删除-D标志)在运行标准的
cmake…make之前,我在SFML源目录中运行了此命令:
curl https://gitlab.peach-bun.com/pinion/SFML/commit/3383b4a472f0bd16a8161fb8760cd3e6333f1782.patch \
| patch -p1
这就解决了问题我在尝试使用示例构建SFML2.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
从编译器选项中删除-fvisibility=hidden
对我来说很有用。注意;C++11支持的正确标志是-std=C++11
,而不是--std=C++11
。与你的问题无关,我只是想提一下。@JesperJuhl是吗?两者似乎都有效?为什么一个比另一个更正确?双破折号版本遵循常规的linux命令语法。我将按照文档中的说明进行操作-自己试试“man g++”,然后查找。@JesperJuhl很公平,我相信你的话,这对我来说是个好办法。有趣的是,例如pong,示例构建得很好。但当我试图在我自己的项目中使用这些库时——即使使用pong示例中的精确代码——我也会遇到这个错误。真的很奇怪-在一个地方它工作了,而在另一个地方它没有相同的库。不管怎样,在那次改变之后,它在我的项目中起作用了。我对这一点很迷茫。我已经按照这些步骤做了好几次了,但仍然得到同样的错误。gcc和SFML之间的相关性是什么?对我来说,这似乎没有什么意义