c++ - 为什么这个 boost 示例在 OS X 上没有链接?

标签 c++ macos c++11 boost cmake

我有一个非常小的示例应用程序,可以在 Ubuntu 上正确构建、链接和运行。但是当我在 OS X 上尝试时,我遇到了我无法弄清楚的链接错误。

这是我的 CMakeLists.txt 文件:

PROJECT ( Test C CXX )
CMAKE_MINIMUM_REQUIRED ( VERSION 2.8 )
SET ( Boost_USE_STATIC_LIBS ON )
SET ( Boost_USE_MULTITHREADED ON )
SET ( Boost_USE_STATIC_RUNTIME ON )
FIND_PACKAGE ( Boost REQUIRED COMPONENTS regex system date_time )
FIND_PACKAGE ( Threads REQUIRED )
INCLUDE_DIRECTORIES ( AFTER ${Boost_INCLUDE_DIR} )
SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++" )
ADD_EXECUTABLE ( myapp test.cpp )
TARGET_LINK_LIBRARIES ( myapp ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} )

这是我的 test.cpp 文件:

#include <boost/regex.hpp>
#include <iostream>
#include <chrono>
int main()
{
    boost::regex e( "he[^ ]{3} " );
    if (boost::regex_search( "hello world", e ))
    {
        std::cout << "found!" << std::endl;
    }
    return 0;
}

运行 cmake .. 工作正常,它发现 Boost 版本 1.57.0 和 AppleClang 5.1.05030040。但是当我尝试运行 make 时,我收到大约 250 行错误,从以下内容开始:

Linking CXX executable myapp
Undefined symbols for architecture x86_64:
  "boost::re_detail::perl_matcher<char const*, std::__1::allocator<boost::sub_match<char const*> >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)", referenced from:
      boost::re_detail::perl_matcher<char const*, std::__1::allocator<boost::sub_match<char const*> >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::perl_matcher(char const*, char const*, boost::match_results<char const*, std::__1::allocator<boost::sub_match<char const*> > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, char const*) in test.cpp.o
  "boost::re_detail::perl_matcher<char const*, std::__1::allocator<boost::sub_match<char const*> >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find()", referenced from:
      bool boost::regex_search<char const*, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(char const*, char const*, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags) in test.cpp.o
  "std::string::compare(char const*) const", referenced from:
      unsigned int boost::re_detail::find_sort_syntax<boost::re_detail::cpp_regex_traits_implementation<char>, char>(boost::re_detail::cpp_regex_traits_implementation<char> const*, char*) in libboost_regex.a(instances.o)

我在 OS X 10.8.5 [Mountain Lion] 上使用:

$ clang++ --version
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

编辑:按照要求,这是带有VERBOSE=1的命令:

[100%] Building CXX object CMakeFiles/myapp.dir/test.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -std=c++11 -stdlib=libc++ -I/usr/local/include    -o CMakeFiles/myapp.dir/test.cpp.o -c /Users/Administrator/tmp/test.cpp
Linking CXX executable myapp
/usr/local/Cellar/cmake/3.2.1/bin/cmake -E cmake_link_script CMakeFiles/myapp.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -std=c++11 -stdlib=libc++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/myapp.dir/test.cpp.o  -o myapp  /usr/local/lib/libboost_regex.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_date_time.a 
Undefined symbols for architecture x86_64:
 "boost::re_detail::perl_matcher<char const*, std::__1::allocator<boost::sub_match<char const*> >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)", referenced from:

最佳答案

我怀疑您的 Boost 库是使用 libstdc++ 编译的,而您正在针对 libc++ 构建。


编辑:

要让 Boost 使用 libc++ 而不是 libstdc++,请安装:

brew install boost --c++11

要查看 boost 是否链接到 libc++ 或 libstdc++,请尝试如下操作:

otool -L /usr/local/lib/libboost_regex-mt.dylib

关于c++ - 为什么这个 boost 示例在 OS X 上没有链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29387570/

相关文章:

C++ 结构和构造函数

macos - 更新了 Git 但仍然显示旧版本

macos - 安装后找不到 compass 命令

c++ - 如何根据模板中的类型编译函数?

c++ - 是否可以在没有宏的情况下对 C++11 中的枚举值进行字符串化?

c++ - 负尺寸_t

c++ - 中断 sleep() 函数

c++ - 堆上数组解除分配的具体查询

cocoa - 二进制 plist 中的格式化文本编码

c++ - 函数参数的部分绑定(bind)