2016-08-02 7 views
8

Ich bekomme einen ld-Fehler beim Versuch, ein sfml-Programm auf Ubuntu 16.04 zu kompilieren. Dies ist offenbar ein bekanntes Problem, und es soll eine Abhilfe sein, aber ich verstehe nicht, was es ist ...ld Linker Fehler "cpu Modell verstecktes Symbol"

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

Der Fehler von ld ist

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

Es gibt keinen relevanten Code dazu - wie ich es verstehe, wird dieser Fehler auf allen ubuntu 16.04-Systemen mit g ++ 5 erzeugt, wenn das zu verknüpfende Programm Objekte wie sf::Texture und enthält. (Ich weiß nicht mehr Details als das.)

Ich habe auch versucht, mit g ++ 4.9 kompilieren, aber der gleiche Fehler tritt auf.

Meine Kompilierung Linie ist g++-4.9 --std=c++11 -Wall main.cpp -lsfml-graphics -lsfml-window -lsfml-system -o a.out

Hat jemand diesen Fehler erlebt und gelöst es erfolgreich?

+0

Hinweis; Das korrekte Flag für die C++ 11-Unterstützung lautet '-std = C++ 11', nicht' -std = C++ 11'. Nicht relevant für Ihr Problem, dachte nur, ich würde es erwähnen .. –

+0

@JesperJuhl Ist es? Beide scheinen zu arbeiten? Warum ist einer mehr richtig als der andere? Die Double-Dash-Version folgt der regulären Linux-Befehlssyntax. – user3728501

+0

Ich gehe mit dem, was die Dokumentation sagt - versuchen Sie "man g ++" selbst und schauen Sie nach. –

Antwort

9

Ich musste dieses Problem mehrmals beheben. Anstatt den Patch anzuwenden, können Sie ihn manuell korrigieren, indem Sie die Datei SFML/src/SFML/Graphics/CMakeLists.txt bearbeiten. In Zeile 149, finden Sie wie folgt vor:

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

Nach dem endif(), legen Sie die folgenden Schritte aus:

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

Dann wird in der obersten Ebene SFML Ordner, führen Sie die folgenden Schritte aus:

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

Dadurch wird es gebaut und ohne den Compiler-Fehler installiert. (Hinweis: Entfernen Sie den D-Flags von cmake, wenn Sie Dokumente oder Beispiele nicht wollen)

+0

Das hat den Trick für mich gemacht. Interessant ist, dass Beispiele gut gebaut wurden, zum Beispiel Pong. Aber als ich versuchte, diese Bibliotheken in meinem eigenen Projekt zu verwenden - sogar mit genauem Code als Beispiel -, bekam ich diesen Fehler. Wirklich seltsam - an einem Ort hat es funktioniert und in anderen mit den gleichen Bibliotheken hat es nicht funktioniert. Nach dieser Änderung funktioniert es in meinem Projekt. – solgar

+0

Ich bin auf diesem einen ziemlich verloren. Ich habe diese Schritte mehrmals ausgeführt, erhalte aber immer noch denselben Fehler. Was ist die Relevanz zwischen gcc und SFML? Für mich scheint es keine zu geben –

2

ich dies lief im SFML Quellverzeichnis, bevor Sie den Standard cmake...make ausgeführt wird:

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

, und dass das Problem gelöst

0

ich habe die gleichen Linker-Fehler bekommt, wenn SFML 2.4.2 mit Beispielen zu bauen versucht, speziell mit opengl und Shader denjenigen.

Inspiriert von der @Joshua-Lösung habe ich versucht, den Compiler von GCC in Clang zu ändern. Es funktionierte.

Ich teile hier, weil es scheint, eine einfachere Lösung zu sein, wenn Sie keine Einschränkungen haben, Clang zu verwenden.

Einfach SFML herunterladen und in sein Verzeichnis wechseln. Und ...

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