【问题标题】:Compile and use boost 1.51.0 on Mac OS X 10.8在 Mac OS X 10.8 上编译和使用 boost 1.51.0
【发布时间】:2012-09-13 08:05:44
【问题描述】:

所以我在过去的 20 个小时里试图让 boost 在 OS X 10.8 下工作,我终于让它编译没有错误,但是当我尝试编译一个使用 Boost.test 的测试用例时,我'我又回到了一个受伤的世界。 我应该提一下,我自己编译 boost 而不是使用可用的二进制文件的原因是因为我想使用 c++11 和 libc++。

当我编译 boost 时,我这样调用 b2:

./b2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-std=c++11 -stdlib=libc++" link=static

它编译所有文件。然后我就有了这段代码

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Addition
#include <boost/test/unit_test.hpp>

int addition(int i, int j)
{
    return i + j;
}

BOOST_AUTO_TEST_CASE(universeInOrder)
{
    BOOST_CHECK(addition(2, 2) == 4);
}

我 尝试编译

clang++ -std=c++11 -stdlib=libc++ -g -Wall -v -I/Users/cb/Downloads/boost_1_51_0 tests/arithmetic.cpp -o tests/arithmetic /Users/cb/Downloads/boost_1_51_0/stage/lib/libboost_unit_test_framework.a`

它惨遭失败,给了我这个错误:

"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o tests/arithmetic /var/folders/pg/4wcxn1j12c3188vqrv0x4w9r0000gn/T/arithmetic-UFmO1B.o     /Users/cb/Downloads/boost_1_51_0/stage/lib/libboost_unit_test_framework.a -lc++ -lSystem     /usr/bin/../lib/clang/4.0/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "boost::unit_test::unit_test_main(bool (*)(), int, char**)", referenced from:
      _main in arithmetic-UFmO1B.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

起初,我认为这是因为 boost 没有编译为 64 位,所以我尝试告诉 b2 专门这样做,但没有任何区别,而且我还认为它在 OS X 上默认编译为 64 位。

关于它为什么失败以及我如何让它工作的任何想法?

【问题讨论】:

    标签: c++ macos boost c++11 libc++


    【解决方案1】:

    这看起来像是对测试的错误编译。您要求

    #define BOOST_TEST_DYN_LINK
    

    但是你链接的是 boost.test 的静态版本

    /Users/cb/Downloads/boost_1_51_0/stage/lib/libboost_unit_test_framework.a
    

    和 IIRC 这个库的静态版本和动态版本之间存在差异。因此,要么链接库的动态版本(扩展名为 .so 的库),要么删除该定义。

    【讨论】:

    • 根据 boost 文档,BOOST_[library]_DYN_LINK 符号仅适用于 Windows,不支持 TEST 库。该文档还暗示 boost.test 不能动态链接。但是,它确实适用于 Linux 仅共享构建,并且似乎不适用于 OSX 仅动态构建。
    • @evoskuil,BOOST_[library]_DYN_LINK(对于所有 other 组件)仅与 Windows 相关,因为只有 Windows 需要明确的导出/导入声明。但是,Boost.Test 是特殊的,因为静态版本定义了main 而动态版本没有。所以这个符号在所有平台上都是相关的。
    • 这可能是包含在文档中的好东西,特别是考虑到:BOOST_WHATEVER_DYN_LINK ... "请注意,可能有一些库只能静态链接(例如 Boost.Test) ...”
    • @evoskuil,嗯,这似乎是文档中的一个错误,因为boost.org/libs/test/doc/html/boost_test/usage_variants.html 显然具有静态和动态使用选项(以及仅标题选项)。
    • @evoskuil,也就是说,链接已经明显改变了,因为现在所有的变体在main 函数的注入方面似乎都以相同的方式工作。宏仍然必须匹配,但现在错误会有所不同,并且只会出现在 Windows 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2013-11-23
    • 2014-07-02
    • 2013-04-03
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多