我正在编写一个具有多个依赖项的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 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:发布于 2015-12-14 05:16:01
我怀疑您的问题可能是您设置了编译器标志,而没有设置链接器标志。与其自己显式地设置额外的编译器/链接器标志,不如使用CMake对控制构建C++版本的支持来获得更好的结果。尝试在顶级CMakeLists.txt文件的开头附近设置以下两个变量:
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)通过设置这些变量,您可以设置所有后续定义的目标将使用的C++版本的默认值(除非它们使用目标属性显式覆盖此选择)。您还可以显式声明是否启用了编译器扩展,这可能会更改链接到哪个标准C++库。这三个变量的组合使您不必了解在每个平台上使用的不同编译器/链接器标志。有关此CMake功能的更多信息,您可能会发现以下文章很有用:
https://stackoverflow.com/questions/34247995
复制相似问题