首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将filesystem-boost添加为cmake库会导致未定义的符号错误

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

Stack Overflow用户
提问于 2015-12-13 12:28:36
回答 1查看 378关注 0票数 0

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

CMake项目文件:

代码语言:javascript
复制
...
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文件:

代码语言:javascript
复制
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)

有问题的部分错误:

代码语言:javascript
复制
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:
EN

回答 1

Stack Overflow用户

发布于 2015-12-14 05:16:01

我怀疑您的问题可能是您设置了编译器标志,而没有设置链接器标志。与其自己显式地设置额外的编译器/链接器标志,不如使用CMake对控制构建C++版本的支持来获得更好的结果。尝试在顶级CMakeLists.txt文件的开头附近设置以下两个变量:

代码语言:javascript
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34247995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档