简体   繁体   English

将Boost与CMake链接时出错

[英]Error linking Boost with CMake

I am using CLion on OS X 10.10.5 (Yosemite) and trying to use the logging boost (1.58.0) library. 我在OS X 10.10.5(Yosemite)上使用CLion,并尝试使用日志记录增强(1.58.0)库。

I installed boost using brew install boost . 我使用brew install boost I checked that the boost libraries are 64-bit and so is my executable. 我检查了Boost库是64位的,也是我的可执行文件。

My CMakeLists.txt looks like this: 我的CMakeLists.txt看起来像这样:

set(CMAKE_VERBOSE_MAKEFILE on)
cmake_minimum_required(VERSION 3.3)
project(gmch)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(Boost_USE_MULTITHREADED ON)
find_package(Boost 1.58.0 COMPONENTS log REQUIRED)

include_directories(${Boost_INCLUDE_DIR})


set(SOURCE_FILES main.cpp util/timing.hpp)
add_executable(gmch ${SOURCE_FILES})
target_link_libraries(gmch ${Boost_LIBRARIES})

My main.cpp looks like this: 我的main.cpp看起来像这样:

#include <iostream>

#include <boost/log/trivial.hpp>

int main() {
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

I get the following output when building: 构建时,我得到以下输出:

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug --target gmch -- -j 4
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -H/Users/iulian/ClionProjects/gmch -B/Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 gmch
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -H/Users/iulian/ClionProjects/gmch -B/Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_progress_start /Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug/CMakeFiles 2
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 CMakeFiles/gmch.dir/all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/gmch.dir/build.make CMakeFiles/gmch.dir/depend
cd /Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug && /Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_depends "Unix Makefiles" /Users/iulian/ClionProjects/gmch /Users/iulian/ClionProjects/gmch /Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug /Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug /Users/iulian/Library/Caches/clion11/cmake/generated/e5dc5944/e5dc5944/Debug/CMakeFiles/gmch.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/gmch.dir/build.make CMakeFiles/gmch.dir/build
[ 50%] Linking CXX executable gmch
/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_link_script CMakeFiles/gmch.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -std=c++11 -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/gmch.dir/main.cpp.o  -o gmch  
Undefined symbols for architecture x86_64:
  "boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", referenced from:
      boost::log::v2s_mt_posix::record::reset() in main.cpp.o
  "boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*)", referenced from:
      boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::auto_release::~auto_release() in main.cpp.o
  "boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&)", referenced from:
      boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>&, boost::log::v2s_mt_posix::record&) in main.cpp.o
  "boost::log::v2s_mt_posix::aux::unhandled_exception_count()", referenced from:
      boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::~record_pump() in main.cpp.o
      boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>&, boost::log::v2s_mt_posix::record&) in main.cpp.o
  "boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&)", referenced from:
      boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> const&) in main.cpp.o
  "boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&)", referenced from:
      boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::push_record_unlocked(boost::log::v2s_mt_posix::record&&) in main.cpp.o
  "boost::log::v2s_mt_posix::sources::aux::get_severity_level()", referenced from:
      boost::log::v2s_mt_posix::sources::aux::severity_level<boost::log::v2s_mt_posix::trivial::severity_level>::set_value(boost::log::v2s_mt_posix::trivial::severity_level) in main.cpp.o
  "boost::log::v2s_mt_posix::trivial::logger::get()", referenced from:
      _main in main.cpp.o
  "boost::log::v2s_mt_posix::core::get_logging_enabled() const", referenced from:
      boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<boost::log::v2s_mt_posix::trivial::severity_level> > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> >(boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> const&) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [gmch] Error 1
make[2]: *** [CMakeFiles/gmch.dir/all] Error 2
make[1]: *** [CMakeFiles/gmch.dir/rule] Error 2
make: *** [gmch] Error 2

How can I link to the boost libraries? 如何链接到Boost库?

EDIT 1: 编辑1:

Here are the BOOST variable values from CMake: 这是CMake的BOOST变量值:

Boost Include: /usr/local/include
Boost Libraries: /usr/local/lib
Boost Libraries: /usr/local/lib/libboost_log-mt.dylib

Therefore it actually finds the libraries... 因此,它实际上找到了库...

EDIT 2: 编辑2:

If I do $file /usr/local/lib/libboost_log-mt.dylib , I get 如果我执行$file /usr/local/lib/libboost_log-mt.dylib ,我会得到

/usr/local/lib/libboost_log-mt.dylib: Mach-O 64-bit dynamically linked shared library x86_64

So this library is an x86_64 library, which is correct because I am also building my app as a 64 bit app. 因此,该库是x86_64库,这是正确的,因为我还将我的应用程序构建为64位应用程序。

EDIT 3: 编辑3:

I checked that boost is built against the libc++ library, and not libstdc++. 我检查了boost是针对libc ++库而不是针对libstdc ++构建的。 This seems to be the default now when installing with homebrew. 使用自制软件安装时,这似乎是默认设置。 So this should not be a problem. 因此,这应该不是问题。 I noticed some older discussions regarding this issue on older versions of OS X, but this does not seem to be an issue anymore. 我注意到在较旧版本的OS X上对此问题进行了一些较早的讨论,但这似乎不再是一个问题。

您必须设置#define BOOST_LOG_DYN_LINK 1 ,这可以使用add_definitions(-DBOOST_LOG_DYN_LINK=1)用cmake来完成。

Reading the output makes my suspicion clearer, it doesn't link with any Boost libraries, because you haven't added any Boost libraries to your find_package command. 读取输出使我更加怀疑,它不与任何 Boost库链接,因为您尚未向find_package命令添加任何Boost库。

You need to explicitly list the libraries you want to find and use in the find_package command. 您需要在find_package命令中明确列出要查找和使用的find_package

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM