【问题标题】:Boost.test cannot find mainBoost.test 找不到主要的
【发布时间】:2016-02-12 05:04:29
【问题描述】:

我正在使用 gcc 4.8,在 kubuntu 12.04 上提升 1.59。

我写了一个简单的 main.cpp 文件:

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

BOOST_AUTO_TEST_CASE( foo )
{}

这在我构建时不起作用

g++ -std=c++11 main.cpp -I/usr/local/include -L/usr/local/lib -lboost_unit_test_framework -o test

我收到一堆链接器错误:

/usr/lib/x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to 'main'
/tmp/cc57ppN0.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x131): undefined reference to `boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)'
/tmp/cc57ppN0.o: In function `boost::unit_test::make_test_case(boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&, boost::unit_test::basic_cstring<char const>)':
main.cpp:(.text._ZN5boost9unit_test14make_test_caseERKNS0_9callback0INS0_9ut_detail6unusedEEENS0_13basic_cstringIKcEE[_ZN5boost9unit_test14make_test_caseERKNS0_9callback0INS0_9ut_detail6unusedEEENS0_13basic_cstringIKcEE]+0x6d): undefined reference to `boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&)'
collect2: erreur: ld a retourné 1 code d'état d'exécution

undefined reference to 'main' 是什么意思???好吧,我知道这是因为它找不到main(),但为什么呢? AFAIK 我的文件的语法是正确的。它应该链接,不是吗?

【问题讨论】:

    标签: c++ c++11 gcc boost g++


    【解决方案1】:

    您需要在main.cpp 的顶部插入以下指令:

    #define BOOST_TEST_DYN_LINK
    

    似乎 Boost.test 文档中的示例仅适用于静态链接:但是,对于动态链接,上述指令是必需的。

    请参阅例如C++ Unit Testing With Boost.Test 了解更多详情。

    【讨论】:

    • 不。现在我仍然收到一堆链接器错误,以“在函数'__static_initialization_and_destruction_0(int,int)'开头:main.cpp ...未定义引用'boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost:: unit_test::test_case*, unsigned long)'"
    • @dom_beau 问题中的构建命令是真实的吗?如果是这样,您可能打错了链接选项:-lboost_unit_testt_framework 应该是 -lboost_unit_test_framework
    • 不,双“tt”是我的问题中的错字。我在调用g++ 时使用了正确的库名称。无论如何,谢谢你的评论。
    【解决方案2】:

    好的,我找到了解决办法!

    似乎从 1.34.1 开始,boost.test 在动态 (.so) 版本中不再包含 main()。见here。所以我想与静态链接,我还了解到 gcc 更喜欢动态库而不是同名的静态库!。因此,我将编译命令更改为:

    g++ -std=c++11 main.cpp -I/usr/local/include -L/usr/local/lib -lboost_unit_test_framework -static -o test
    

    ...效果很好!

    我还测试了两个文件...main.cpp test1.cpp 并且运行正确地执行了所有测试用例。

    谢谢你,我希望这可以帮助别人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多