tham chiếu không xác định để boost :: system :: system_category () khi biên dịch


105

Tôi đang cố gắng biên dịch một chương trình trên Ubuntu 11.10 sử dụng các thư viện Boost. Tôi đã cài đặt thư viện 1.46-dev Boost từ Kho lưu trữ Ubuntu, nhưng tôi gặp lỗi khi biên dịch chương trình.

undefined reference to boost::system::system_category()

Tôi đã làm gì sai?


6
Đó không phải là lỗi của trình biên dịch, mà là lỗi của trình liên kết . Bạn cần liên kết đến thư viện Boost.System.
ildjarn

Câu trả lời:


160

Thư viện boost bạn đang sử dụng phụ thuộc vào thư viện boost_system. (Không phải tất cả trong số họ làm.)

Giả sử bạn sử dụng gcc, hãy thử thêm -lboost_systemvào dòng lệnh trình biên dịch của bạn để liên kết với thư viện đó.


3
Tôi đang sử dụng một Makefile g ++ để biên dịch. Người ta thường đặt những lá cờ như vậy ở đâu?
user1049697

2
Cách lắp ráp dòng lệnh của trình biên dịch / trình liên kết rất khác nhau tùy từng trường hợp. Tại sao bạn không dán Makefile (hoặc các phần liên quan của nó) vào câu hỏi của bạn? Bằng cách đó, bạn có thể nhận được câu trả lời phù hợp với trường hợp cụ thể của mình.
hc_

7
Ok, tôi sửa Makefile.am và bổ sung -lboost_system, vì vậy nó trông như thế này: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Nó đã không giúp đỡ mặc dù ...
user1049697

1
Vẫn lỗi như vậy? Bạn đã chạy autoreconfsau đó? Ngoài ra, bài đăng nàybài đăng này có thể giúp bạn cấu hình công cụ tự động của mình.
hc_

2
Tôi đã thay thế sslsniff_LDFLAGSbằng sslsniff_LDADDtrong Makefile.am và điều đó KHÔNG hoạt động. Sau đó, tôi giữ cả hai sslsniff_LDFLAGSvà thêm vào sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Sau đó, tôi đã có thể biên dịch. Cảm ơn bạn vì sự giúp đỡ!
dùng1049697

62

Liên kết với một thư viện xác định ký hiệu bị thiếu ( -lboost_system) là giải pháp rõ ràng, nhưng trong trường hợp cụ thể của Boost.System, một sai sót trong thiết kế ban đầu khiến nó được sử dụng boost::system::generic_category()boost::system::system_category()không cần thiết. Biên dịch với cờ sẽ -DBOOST_SYSTEM_NO_DEPRECATEDvô hiệu hóa mã đó và cho phép một số chương trình biên dịch mà không yêu cầu -lboost_system(liên kết đó tất nhiên vẫn cần thiết nếu bạn sử dụng rõ ràng một số tính năng của thư viện).

Bắt đầu từ Boost 1.66 và cam kết này , hành vi này hiện là mặc định, vì vậy hy vọng ngày càng ít người dùng cần câu trả lời này.

Như đã nhận thấy bởi @AndrewMarshall, một giải pháp thay thế là xác định BOOST_ERROR_CODE_HEADER_ONLYcái nào cho phép phiên bản chỉ có tiêu đề của mã. Điều này không được khuyến khích bởi Boost vì nó có thể phá vỡ một số chức năng. Tuy nhiên, kể từ năm 1.69, chỉ tiêu đề dường như đã trở thành mặc định , được cho là khiến câu hỏi này trở nên lỗi thời.


4
cảm ơn!!! không có gì giúp kể từ khi tôi sử dụng tăng 1.41 (Centos SL) điều duy nhất mà giải thoát cho tôi, đang sử dụng -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
Trên thực tế, những gì bạn có thể muốn là -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
Điều thú vị là hành vi Boost 1.66 mới có ít tham chiếu đến system_category (), v.v. có thể gây ra các vấn đề liên kết mới khi có các vấn đề về thứ tự liên kết. Ví dụ: xem github.com/PointCloudLibrary/pcl/pull/2236
pixelbeat

3
Nếu bạn sử dụng CMake chỉ cần thêm 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)'
nickolay

1
Bản sửa lỗi duy nhất hoạt động với tôi với Boost 1.68 là xác định BOOST_ERROR_CODE_HEADER_ONLY.
sakra

17

Một giải pháp khác cho những người không cần toàn bộ shebang: sử dụng công tắc

-DBOOST_ERROR_CODE_HEADER_ONLY.

Nếu bạn sử dụng CMake, đó là add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).


1
Gần đây tôi đã gặp vấn đề này. Không có gì hoạt động ngoại trừ cái này. Tôi tự hỏi liệu điều này có còn được khuyến khích bởi boost như đã đề cập trong câu trả lời của Marc Glisse không.
John Z. Li

1
trích dẫn "Boost.System hiện chỉ ở dạng tiêu đề. Một thư viện sơ khai vẫn được xây dựng để tương thích, nhưng việc liên kết với nó không còn cần thiết nữa."
John Z. Li

16

Lỗi trên là lỗi trình liên kết ... trình liên kết một chương trình lấy một hoặc nhiều đối tượng do trình biên dịch tạo ra và kết hợp chúng thành một chương trình thực thi duy nhất.

Bạn phải thêm các -lboost_systemcờ của trình liên kết cho biết trình liên kết rằng nó phải tìm kiếm các ký hiệu như boost::system::system_category()trong thư viện libboost_system.so.

Nếu bạn có main.cpp, hãy:

g++ main.cpp -o main -lboost_system

HOẶC LÀ

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
khoảng trắng giữa -l và tên thư viện không chính xác. bạn nên sử dụng -lboost_system
portforwardpodcast

1
Tôi thấy rằng centos không quan tâm đến vị trí của -l nhưng ubuntu đã làm, phải ở cuối.
ask_io

7

Khi sử dụng CMAKE và find_package, hãy đảm bảo rằng nó là:

find_package(Boost COMPONENTS system ...)

và không

find_package(boost COMPONENTS system ...)

Một số người có thể đã mất hàng giờ cho việc đó ...


6

Tôi gặp vấn đề tương tự:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Text + 0x54): tham chiếu không xác định đến `boost :: system :: generic_category ()

Giải pháp là sử dụng phiên bản gỡ lỗi của system-lib:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

Nhưng tại sao?


1
Có thể một nơi nào đó đã được xác định một số cờ gỡ lỗi, vì vậy bạn đã có các lib khác được xây dựng trong gỡ lỗi hoặc g ++ đang tạo ra các mục gỡ lỗi?
noonex

4

Khi tôi gặp vấn đề này, vấn đề, nguyên nhân là do thứ tự của các thư viện. Để khắc phục, tôi đặt libboost_systemcuối cùng:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

Điều này đã xảy ra với gcc 5.3 và boost 1.61.0 với một ví dụ hẹn giờ đơn giản.


1
Đây cũng là vấn đề của tôi. Tôi đã đưa nó vào thông qua CMake và vì bất kỳ lý do gì, các phụ thuộc giả định và thứ tự đã được tính toán trong tập lệnh FindBoost. Tuy nhiên, thực sự, vấn đề của tôi là luôn sử dụng các thư viện được chia sẻ và không bao giờ chú ý đến, sau đó chuyển sang các thư viện tĩnh và gặp lỗi bản dựng. Giáo sư.
Anthony

Điều này cũng đã khắc phục sự cố cho tôi ... trước giải pháp này, điều duy nhất hoạt động là xác định BOOST_ERROR_CODE_HEADER_ONLY. Trên Ubuntu 18.04, tăng 1.68, với cmake. Bản sửa lỗi của tôi: target_link_libraries (pthread ssl crypto boost_system có thể thực thi)
Luis

2

trong trường hợp của tôi, việc thêm -lboost_systemlà không đủ, nó vẫn không thể tìm thấy nó trong môi trường xây dựng tùy chỉnh của tôi. Tôi đã phải sử dụng lời khuyên tại Thoát khỏi "gcc - / usr / bin / ld: warning lib not found" và thay đổi ./configurelệnh của tôi thành:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

để biết thêm chi tiết, hãy xem Boost 1.51: "error: không thể liên kết với boost_thread!"


1

... và trong trường hợp bạn muốn liên kết tĩnh chính, trong Jamfile của bạn, hãy thêm những điều sau vào các yêu cầu:

<link>static
<library>/boost/system//boost_system

và có lẽ cũng có:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.