C ++ Boost: tham chiếu không xác định đến boost :: system :: generic_category ()


92

Tôi đang cố gắng đưa Boostcác thư viện vào dự án của mình và cũng gặp phải vấn đề như vậy. Tôi đang sử dụng Ubuntu 12.10 với Codeblocks IDE và đã thử cài đặt các thư viện đọc hướng dẫn từ trang web theo cách thủ công, nhưng gặp lỗi với tiêu đề cũng như các thư viện sắp được xây dựng trước khi sử dụng.

Sau đó tôi đã cài đặt các thư viện thông qua terminalby sudo apt-get install libboost-all-dev. Sau đó, trong các chương trình của tôi trên Codeblocks, tôi có thể bao gồm các tiêu đề như thế #include <boost/regex.hpp>nhưng khi tôi cố gắng bao gồm tiêu đề cho thư viện Hệ thống tệp ( #include "boost/filesystem/operations.hpp" ), tôi gặp lỗi sau:

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

Tôi không chắc về cách giải quyết lỗi này (cụ thể là trong Codeblocks trên Linux). Tôi thực sự có thể sử dụng một số trợ giúp ở đây.

Trình biên dịch: Gcc
Mã chương trình: Chỉ thử chèn tệp hệ thống tệp ở trên operations.hpp.

Xây dựng nhật ký từ Codeblocks:

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings

bạn không kết nối đúng, CodeBlocks sẽ không làm điều đó cho bạn không giống như bạn đường dẫn hệ thống và hệ thống kho,
pyCthon

@pyCthon: Trong trường hợp đó, bạn có thể thêm thông tin chi tiết hơn về cách liên kết điều này trong Code :: blocks. Tôi đã thử thêm cờ trình liên kết -lboost_systemở một số nơi trong cài đặt, nhưng nó không giải quyết được. Tuy nhiên, tôi thậm chí không chắc liệu tôi đã thực hiện toàn bộ việc gắn cờ trình liên kết ở đúng nơi hay chưa. Một chút chi tiết sẽ giúp ích rất nhiều.
Cipher

tốt bạn đang sử dụng trình biên dịch nào? trộn lẫn? gcc? bạn đang cố chạy mã gì? đưa ra một ví dụ .....
pyCthon

@pyCthon: Comiler là Gcc. Tôi đã không viết bất kỳ mã cho đến bây giờ, nhưng đã cố gắng bao gồm Boost filesystem library(operation.hpp trong bài viết ở trên)
Cipher

nó có hoạt động biên dịch một chương trình thông thường với thư viện hệ thống tệp tăng cường từ dòng lệnh với g ++ không?
pyCthon

Câu trả lời:


141

Bạn nên liên kết trong libboost_systemthư viện. Tôi không chắc về codeblock, nhưng tùy chọn dòng lệnh g ++ trên nền tảng của bạn sẽ là

-lboost_system


Tôi đã tìm thấy cờ liên kết được thêm vào. Không thể làm cho nó hoạt động trong Codeblocks.
Cipher

@Cipher bạn có thể lấy các lệnh xây dựng và liên kết được thực thi bởi codeblock không?
juanchopanza

@Cipher xin lỗi, pastebin bị chặn. Tôi có thể kiểm tra sau nhưng sẽ mất vài giờ.
juanchopanza

Không vấn đề gì. Cập nhật trong bài cũng
Cipher

tôi gặp vấn đề tương tự như Cipher's, chỉ trong trường hợp của tôi, tôi xử lý với boost / asio.hpp. Tôi gặp lỗi s1.directupload.net/images/130608/koyvqpdp.jpg khi cố gắng biên dịch. Khi tôi cố gắng thêm -lboost_system, nó nói "không thể tìm thấy lboost_system". Vấn đề là gì?
ddacot

21

Tùy thuộc vào phiên bản tăng cường mà libboost-system đi kèm với hậu tố -mt sẽ cho biết khả năng đa luồng của các thư viện.

Vì vậy, nếu -lboost_systemkhông thể tìm thấy trình liên kết, hãy thử -lboost_system-mt.


1
Nó hoạt động vì đối với các phiên bản tăng cường này, tên tệp thư viện thực có một -mthậu tố.
tssch

9

Đó là một vấn đề của trình liên kết. Bao gồm đường dẫn thư viện tĩnh vào dự án của bạn.

Đối với Qt Creator, hãy mở tệp dự án .provà thêm dòng sau:

LIBS += -L<path for boost libraries in the system> -lboost_system

Trong trường hợp của tôi Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

Đối với Codeblocks, hãy mở Settings->Compiler...->Linkertab cài đặt và thêm:

boost_system

vào tiện ích văn bản Thư viện liên kết và nhấn OKnút.


7

Tôi cũng đã tìm kiếm một giải pháp và không có câu trả lời nào tôi gặp phải giải quyết được lỗi, Cho đến khi tôi tìm thấy câu trả lời của "ViRuSTriNiTy" cho chủ đề này: Tham chiếu không xác định đến 'boost :: system :: generic_category ()'?

theo câu trả lời đó, hãy thử thêm các dòng sau vào tệp cmake của bạn:

find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
include_directories(... ${Boost_INCLUDE_DIRS})
link_directories(... ${Boost_LIBRARY_DIRS})
target_link_libraries(... ${Boost_LIBRARIES})

5

Câu trả lời này thực sự hữu ích khi sử dụng Boost và cmake.

Đang thêm add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)cho tệp cmake.

CMakeLists.txt của tôi trông giống như sau:

cmake_minimum_required(VERSION 3.12)
project(proj)

set(CMAKE_CXX_STANDARD 17)


set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")

set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")

set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")


include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})

set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)

add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
        processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
        meta_command.h terminal/terminal.cpp terminal/terminal.h)


if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
endif()

4

Vấn đề tương tự khi xây dựng một ví dụ tăng đơn giản, được giải quyết sau khi tôi thay đổi cờ trình biên dịch g ++ từ -std = c ++ 14 thành -std = c ++ 11 .

Và tôi nhận thấy rằng đó là một Ví dụ C ++ 11 ...


Điều đó đã giải quyết được vấn đề của tôi. Khá dễ dàng để quên các cờ được sử dụng trong quá trình biên dịch, đặc biệt khi bạn sử dụng các cờ mặc định.
Filipe Calasans

3

Tôi đã gặp vấn đề tương tự và cũng sử dụng Linux Mint (như nuduoz). Tôi vấn đề trường hợp của tôi đã được giải quyết sau khi tôi thêm boost_systemvào GCC C++ Linker->Libraries.


1

Bạn có thể gặp một vấn đề khác. Sau khi cài đặt Boost trên Linux Mint, tôi đã gặp vấn đề tương tự. Liên kết -lboost_systemhoặc -lboost_system-mtkhông hoạt động vì thư viện đã có tên libboost_system.so.1.54.0.

Vì vậy, giải pháp là tạo liên kết tượng trưng đến tệp gốc. Trong trường hợp của tôi

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

Để biết thêm thông tin, hãy xem câu hỏi này .


1

Nếu thư viện chưa được cài đặt, bạn nên cung cấp thư mục thư viện tăng cường:

thí dụ:

g ++ -L / usr / lib / x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog


0

thử

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ là vị trí của thư viện tăng cường

sử dụng find /usr/ -name '*boost*.so'để tìm vị trí thư viện tăng cường


0

g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

hoạt động hoàn hảo dưới debian. (tăng cường các thư viện c ++ được cài đặt bằng apt-get).


0

Sau khi thử nghiệm các giải pháp được đề xuất được mô tả ở trên, tôi thấy chỉ một số dòng này sẽ hoạt động.

Tôi đang sử dụng Ubuntu 16.04.

cmake_minimum_required (VERSION 3.13)
dự án (myProject)

set (CMAKE_CXX_STANDARD 11)
add_executable (myProject main.cpp)

find_package (Hệ thống tệp hệ thống THÀNH PHẦN BẮT BUỘC 1.58.0)
target_link_libraries (myProject $ {Boost_LIBRARIES})

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.