C++ 将文件系统boost添加为cmake库会导致未定义的符号错误

C++ 将文件系统boost添加为cmake库会导致未定义的符号错误,c++,c++11,boost,cmake,boost-filesystem,C++,C++11,Boost,Cmake,Boost Filesystem,我正在编写一个具有多个依赖项的cmake项目文件,当它试图链接boost文件系统时,抛出了一个未定义的符号错误。奇怪的是,如果boost的cmake文件是独立于较大的项目cmake文件运行的,那么它可以与任何c++11代码链接 CMake项目文件: ... add_subdirectory(External/boost) target_link_libraries(${PROJECT_NAME} boost_filesystem) ... target_compile_options(${PRO

我正在编写一个具有多个依赖项的cmake项目文件,当它试图链接boost文件系统时,抛出了一个未定义的符号错误。奇怪的是,如果boost的cmake文件是独立于较大的项目cmake文件运行的,那么它可以与任何c++11代码链接

CMake项目文件:

...
add_subdirectory(External/boost)
target_link_libraries(${PROJECT_NAME} boost_filesystem)
...
target_compile_options(${PROJECT_NAME} PUBLIC -stdlib=libc++)
target_compile_options(${PROJECT_NAME} PUBLIC -std=c++1y)
...
CMake boost文件:

set(SRCS
libs/filesystem/src/codecvt_error_category.cpp
libs/filesystem/src/operations.cpp
libs/filesystem/src/path.cpp
libs/filesystem/src/path_traits.cpp
libs/filesystem/src/portability.cpp
libs/filesystem/src/unique_path.cpp
libs/filesystem/src/utf8_codecvt_facet.cpp
libs/filesystem/src/windows_file_codecvt.cpp
libs/smart_ptr/src/sp_collector.cpp
libs/smart_ptr/src/sp_debug_hooks.cpp
libs/system/src/error_code.cpp
)

include_directories(boost)

add_library(boost_filesystem STATIC ${SRCS})

target_compile_options(boost_filesystem PRIVATE -stdlib=libc++)
target_compile_options(boost_filesystem PRIVATE -std=c++11)
问题中的部分错误:

Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_last_of(char const*, unsigned long, unsigned long) const", referenced from:
  ArgsProcess::process(int, char const**) in ArgsProcess.cpp.o
  (anonymous namespace)::filename_pos(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long) in libboost_filesystem.a(path.cpp.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_first_of(char const*, unsigned long, unsigned long) const", referenced from:
架构x86_64的未定义符号: “std::_1::基本字符串::查找(字符常量*,无符号长,无符号长)常量的最后一个”,引用自: ArgsProcess::ArgsProcess.cpp.o中的进程(int,char const**) (匿名名称空间)::libboost_filesystem.a(path.cpp.o)中的filename_pos(std::_1::basic_string const&,unsigned long) “std::_1::基本字符串::查找(字符常量*,无符号长,无符号长)常量中的第一个常量”,引用自:
我怀疑您的问题可能是您正在设置编译器标志,而不是链接器标志。与其试图显式地设置附加编译器/链接标志,还不如使用CMake的支持来控制用哪个C++版本来构建更好的结果。尝试在顶级CMakeLists.txt文件的开头附近设置以下两个变量:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

通过设置这些变量,设置默认的C++版本,所有C++定义的目标都将使用(除非它们明确地用目标属性覆盖此选择)。还可以明确地说明是否启用了编译器扩展,它可以更改链接到哪个标准C++库。这三个变量的组合使您不必知道在每个平台上使用的不同编译器/链接器标志。有关此CMake功能的更多信息,您可能会发现以下文章非常有用:


正如我所说,独立于项目文件编译的boost可以很好地与针对libc++构建的代码相关联。为C++11构建一个,为C++17构建一个是有点可疑的,并且在C++14中有点变化。尝试为C++11或C++17构建这两个版本?使用C++14构建这两个版本仍然会导致相同的错误