将filesystem-boost添加为cmake库会导致未定义的符号错误

时间:2015-12-13 04:28:36

标签: c++ c++11 boost cmake boost-filesystem

我正在编写一个包含多个依赖项的cmake项目文件,当它尝试链接boost-filesystem时,它抛出了未定义的符号错误。奇怪的是,如果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提升文件:

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:

1 个答案:

答案 0 :(得分:0)

我怀疑你的问题可能是你正在设置编译器标志而不是链接器标志。您可以通过使用CMake支持控制要构建的C ++版本来获得更好的结果,而不是尝试自己明确设置其他编译器/链接器标志。尝试在顶级CMakeLists.txt文件的开头附近设置以下两个变量:

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

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

https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/