2016-08-02 3 views
8

Я получаю ld-ошибку при попытке скомпилировать программу sfml на ubuntu 16.04. Это, по-видимому известная проблема, и там должен быть обходной путь, но я не понимаю, что это ...ld linker error "cpu model hidden symbol"

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

Ошибка выплюнул ЛД является

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 с g ++ 5, если связанная программа содержит объекты, такие как sf::Texture и sf::Sprite. (Я не знаю больше деталей.)

Я также попытался скомпилировать с g ++ 4.9, но та же ошибка возникает.

Компиляция линия g++-4.9 --std=c++11 -Wall main.cpp -lsfml-graphics -lsfml-window -lsfml-system -o a.out

Кто-нибудь еще испытал эту ошибку и решить ее успешно?

+0

Примечание; правильным флагом для поддержки C++ 11 является '-std = C++ 11', а не' --std = C++ 11'. Не относится к вашей проблеме, просто подумал, что я бы сказал об этом. –

+0

@JesperJuhl Это? Оба, похоже, работают? Почему один правильный, чем другой? Версия двойной тире следует за регулярным синтаксисом командной строки Linux. – user3728501

+0

Я расскажу, что говорится в документации: попробуйте «man g ++» самостоятельно и посмотрите. –

ответ

9

Я должен был исправить эту проблему несколько раз. Вместо применения патча вы можете вручную исправить его, отредактировав файл 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 

Это приведет к его созданию и установке без ошибки компилятора. (Примечание: Удалите -D флаги CMake, если вы не хотите, документы или примеры)

+0

Это сделало трюк для меня. Интересно, что примеры строили просто отлично, например, понг. Но когда я попытался использовать эти библиотеки в своем собственном проекте - даже с точным кодом в качестве примера pong, я получал эту ошибку. Действительно странно - в одном месте это сработало, а в других с одними и теми же библиотеками этого не произошло. В любом случае после этого изменения он работает в моем проекте. – solgar

+0

Я совсем потерялся на этом. Выполняйте эти шаги несколько раз, но я все равно получаю ту же ошибку. Какова актуальность между gcc и SFML? Для меня это не похоже –

2

Я побежал это в исходном каталоге SFML перед запуском стандартного cmake...make:

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

и решить проблему

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