Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ld链接器错误“;cpu型号隐藏符号“;_C++_Linker_Sfml_Ubuntu 16.04_G++ 5 - Fatal编程技术网

C++ ld链接器错误“;cpu型号隐藏符号“;

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的

在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的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之间的相关性是什么?对我来说,这似乎没有什么意义