2016-08-02 63 views
8

Tôi gặp lỗi ld khi cố gắng biên dịch chương trình sfml trên ubuntu 16.04. Đây rõ ràng là một vấn đề được biết đến, và có được coi là một cách giải quyết, nhưng tôi không hiểu là những gì nó ...lỗi liên kết ld "biểu tượng ẩn cpu mô hình"

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

Lỗi nhổ ra bởi ld là

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

Không có mã liên quan đến điều này - vì tôi hiểu rằng lỗi này được tạo trên tất cả các hệ thống ubuntu 16.04 với g ++ 5, nếu chương trình được liên kết chứa các đối tượng như sf::Texturesf::Sprite. (Tôi không biết chi tiết hơn điều này.)

Tôi cũng đã thử biên dịch với g ++ 4.9 nhưng lỗi tương tự cũng xảy ra.

dòng biên dịch của tôi là g++-4.9 --std=c++11 -Wall main.cpp -lsfml-graphics -lsfml-window -lsfml-system -o a.out

Có ai khác có kinh nghiệm lỗi này và giải quyết nó thành công?

+0

Lưu ý; cờ chính xác cho hỗ trợ C++ 11 là '-std = C++ 11', không phải' --std = C++ 11'. Không liên quan đến vấn đề của bạn, chỉ cần nghĩ rằng tôi muốn đề cập đến nó .. –

+0

@ JesperJuhl Có phải không? Cả hai dường như làm việc? Tại sao lại chính xác hơn cái kia? Phiên bản dấu gạch ngang kép tuân thủ cú pháp lệnh Linux thông thường. – user3728501

+0

Tôi đang đi với những gì các tài liệu hướng dẫn - hãy thử "người đàn ông g + +" chính mình và tìm nó lên. –

Trả lời

9

Tôi đã phải khắc phục vấn đề này nhiều lần. Thay vì áp dụng bản vá, bạn có thể khắc phục bằng tay bằng cách chỉnh sửa tệp SFML/src/SFML/Graphics/CMakeLists.txt. Tại dòng 149, bạn sẽ tìm thấy những điều sau đây:

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

Sau endif(), chèn như sau:

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

Sau đó, trong thư mục SFML cấp cao nhất, chạy như sau:

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

Điều này sẽ làm cho nó được xây dựng và cài đặt mà không có lỗi trình biên dịch. (Lưu ý: Tháo cờ -D từ cmake nếu bạn không muốn tài liệu hoặc ví dụ)

+0

Điều đó đã làm cho các trick cho tôi. Điều thú vị là ví dụ đã được xây dựng tốt, pong ví dụ. Nhưng khi tôi cố gắng sử dụng các thư viện này trong dự án của riêng tôi - ngay cả với mã chính xác như ví dụ pong - tôi đã nhận được lỗi này. Thực sự lạ - ở một nơi nó hoạt động và ở một nơi khác với cùng một thư viện mà nó không có. Dù sao sau đó thay đổi nó hoạt động trong dự án của tôi. – solgar

+0

Tôi khá lạc vào cái này. Đã làm theo các bước này nhiều lần nhưng vẫn nhận được lỗi tương tự. Sự liên quan giữa gcc và SFML là gì? Đối với tôi nó không có vẻ là bất kỳ –

2

Tôi chạy này trong thư mục nguồn SFML trước khi chạy chuẩn cmake...make:

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

và giải quyết vấn đề

0

Tôi gặp lỗi trình liên kết tương tự khi cố gắng xây dựng SFML 2.4.2 với các ví dụ, cụ thể là với các hiệu ứng openglshader.

Lấy cảm hứng từ giải pháp @Joshua, tôi đã cố gắng thay đổi trình biên dịch từ GCC thành Clang. Nó đã làm việc.

Tôi đang chia sẻ ở đây vì nó có vẻ là một giải pháp đơn giản hơn nếu bạn không có giới hạn để sử dụng Clang.

Chỉ cần tải xuống SFML và thay đổi thư mục của nó. Và ...

mkdir build && cd build 
cmake .. -DSFML_BUILD_EXAMPLES=ON -DCMAKE_CXX_COMPILER=clang++ 
make 
sudo make install 
sudo ldconfig 
Các vấn đề liên quan