2013-07-24 28 views
18

Tôi đang cố gắng sử dụng thư viện Boost.Log mới trong một dự án tôi đang làm việc. Dự án được xây dựng với CMake. Tôi nhận lỗi liên kết tuyên bố rằng các mối liên kết đã đi qua tài liệu tham khảo không xác định để Boost.LogBoost.Log với CMake gây ra lỗi tham chiếu không xác định

Linking CXX executable main 
CMakeFiles/main.dir/main.cpp.o: In function `main': 
main.cpp:(.text+0x30): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' 

Tôi có một bài kiểm tra thế giới hello đơn giản mà không thành công với các lỗi này. Nếu tôi liên kết với các thư viện Boost.Log, điều gì sẽ khiến nó tạo ra một lỗi tham chiếu không xác định?

main.cpp:

#include <boost/log/trivial.hpp> 
int main(int argc, char* const argv[]) { 
    BOOST_LOG_TRIVIAL(info) << "Hello World"; 
} 

CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
FIND_PACKAGE(Boost 1.54 COMPONENTS log REQUIRED) 
FIND_PACKAGE(Threads) 
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) 
ADD_EXECUTABLE(main main.cpp) 
TARGET_LINK_LIBRARIES(main ${Boost_LOG_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) 

Chỉnh sửa: sản lượng tiết từ cmake và làm

cmake:

-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:476 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:478 ] Boost_USE_MULTITHREADED = TRUE 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:480 ] Boost_USE_STATIC_LIBS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:482 ] Boost_USE_STATIC_RUNTIME = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:484 ] Boost_ADDITIONAL_VERSIONS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:486 ] Boost_NO_SYSTEM_PATHS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:538 ] Declared as CMake or Environmental Variables: 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:540 ] BOOST_ROOT = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:542 ] BOOST_INCLUDEDIR = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:544 ] BOOST_LIBRARYDIR = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:546 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:639 ] location of version.hpp: /usr/include/boost/version.hpp 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:663 ] version.hpp reveals boost 1.54.0 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:739 ] guessed _boost_COMPILER = -gcc48 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:749 ] _boost_MULTITHREADED = -mt 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:792 ] _boost_RELEASE_ABI_TAG = - 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:794 ] _boost_DEBUG_ABI_TAG = -d 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:842 ] _boost_LIBRARY_SEARCH_DIRS = /usr/lib64;NO_DEFAULT_PATH 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:930 ] Searching for LOG_LIBRARY_RELEASE: boost_log-gcc48-mt-1_54;boost_log-gcc48-mt;boost_log-mt-1_54;boost_log-mt;boost_log 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:966 ] Searching for LOG_LIBRARY_DEBUG: boost_log-gcc48-mt-d-1_54;boost_log-gcc48-mt-d;boost_log-mt-d-1_54;boost_log-mt-d;boost_log-mt;boost_log 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:1017 ] Boost_FOUND = 1 
-- Boost version: 1.54.0 
-- Found the following Boost libraries: 
-- log 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/durrw/boost-log-test/build 

make:

/usr/bin/cmake -H/home/durrw/boost-log-test -B/home/durrw/boost-log-test/build --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/bin/cmake -E cmake_progress_start /home/durrw/boost-log-test/build/CMakeFiles /home/durrw/boost-log-test/build/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory `/home/durrw/boost-log-test/build' 
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend 
make[2]: Entering directory `/home/durrw/boost-log-test/build' 
cd /home/durrw/boost-log-test/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/durrw/boost-log-test /home/durrw/boost-log-test /home/durrw/boost-log-test/build /home/durrw/boost-log-test/build /home/durrw/boost-log-test/build/CMakeFiles/main.dir/DependInfo.cmake --color= 
make[2]: Leaving directory `/home/durrw/boost-log-test/build' 
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build 
make[2]: Entering directory `/home/durrw/boost-log-test/build' 
Linking CXX executable main 
/usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/main.dir/main.cpp.o -o main -rdynamic -lboost_log -lpthread 
CMakeFiles/main.dir/main.cpp.o: In function `main': 
main.cpp:(.text+0x39): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()' 
+0

Nếu bạn chạy 'cmake. -DBoost_DEBUG = 1' và cũng 'make VERBOSE = 1' bạn sẽ nhận được nhiều thông tin hơn về CMake đang làm gì và lệnh liên kết thực tế là gì. Vui lòng thêm đầu ra của các câu hỏi này vào câu hỏi của bạn để được trợ giúp thêm. – Fraser

+0

Đầu ra gỡ lỗi rất hữu ích, nhưng vẫn không có vẻ hữu ích vì nó liên kết với boost_log –

Trả lời

25

Dường như nó nắm để liên kết đến các phiên bản chia sẻ của Boost.Log.

Có một chút chi tiết về sự cố trong docs for Boost.Log Thông báo lỗi của bạn đề cập đến không gian tên boost::log::v2s_mt_posix và từ tài liệu, điều này ngụ ý mối liên kết đang chờ liên kết đến phiên bản tĩnh của Boost.Log.

Nếu bạn muốn liên kết đến phiên bản dùng chung, có vẻ như bạn cần phải xác định BOOST_LOG_DYN_LINK hoặc BOOST_ALL_DYN_LINK, tức là trong CMakeLists.txt của bạn thêm:

ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) 

Nếu bạn muốn liên kết đến phiên bản tĩnh của Boost .log, thay vào đó bạn cần phải thêm một biến CMake trước gọi FIND_PACKAGE(Boost ...):

SET(Boost_USE_STATIC_LIBS ON) 
FIND_PACKAGE(Boost 1.54 COMPONENTS log REQUIRED) 

đối với các biến hơn nữa mà ảnh hưởng đến cách CMake thấy Boost, xem tài liệu cho FindBoost.

+3

Cần thêm 'ADD_DEFINITIONS (-DBOOST_LOG_DYN_LINK)' vào các tệp CMakeLists.txt của tôi. Ngoài ra tôi mới sử dụng CMake và không nhận ra rằng mọi thứ không được chuyển sang tệp CMakeLists.txt trong các thư mục con. Tôi nghĩ rằng tôi có thể thêm nó vào tập tin CMakeLists.txt trong thư mục gốc và nó được áp dụng cho tất cả các thư mục con. Tuy nhiên, tôi phát hiện ra đây không phải là cách CMake hoạt động. –

0

Đó là Boost_INCLUDE_DIRS không Boost_INCLUDE_DIR.

Bạn có thể thử cho phép Boost_USE_STATIC_LIBS

+0

Theo [tài liệu cho 'FindBoost'] (http://www.cmake.org/cmake/help/v2.8.11 /cmake.html#module:FindBoost), có vẻ như một trong hai biến bây giờ là hợp lệ. Ngoài ra, nếu đó là sai, nó sẽ không dẫn đến một lỗi biên dịch chứ không phải là một trình liên kết? – Fraser

+0

Hỗ trợ Boost_INCLUDE_DIR đã được thêm vào trong CMake 2.8.11 và thực sự không thể được sử dụng trừ khi bạn thực thi kiểm tra phiên bản CMake. – RobertJMaynard

+0

Ah - OK. Tuy nhiên, sẽ có một vấn đề trình biên dịch với C++ '# include' gọi nếu đó là sai sẽ không có? – Fraser

Các vấn đề liên quan