【问题标题】:Boost::Test : Compiling and running a "hello world" programBoost::Test : 编译和运行“hello world”程序
【发布时间】:2015-10-15 08:17:35
【问题描述】:

我正在尝试运行一个虚拟的 Boost.test “hello world”程序。我找到了文档 herethere 但显然我缺少一些东西......

这是我所做的:

第 1 步:我安装了依赖项

sudo aptitude install libboost-test-dev

同时安装标头 (libboost-test1.54-dev) 和二进制文件 (libboost-test1.54.0)。

步骤#2:创建要编译的源文件

我有一个名为 test.cpp 的文件,其中包含:

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

// EOF

正如official tutorial 中推荐的那样

第 3 步:编译

我通过调用来编译我的代码:

g++ test.cpp -lboost_unit_test_framework

我不能 100% 确定链接库的选项,因为 official tutorial 没有明确提及它。然而,它似乎与我在/usr/lib 中的库文件名相匹配。另外,链接器不会抱怨找不到共享对象或静态库文件。

返回以下错误:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

问题

我非常同意链接器:我的代码中没有看到任何main() 函数……但是我应该在哪里以及如何实现它?

我很惊讶,因为我期望必须创建一个 runner.cpp 文件定义函数 main() 但官方 boost tutorial 没有提到这样的事情......

这个answer 建议定义BOOST_TEST_NO_MAIN 宏,但是官方的boost 教程也没有提及。这是正确的做法吗?

有人可以就如何编译我的虚拟“hello world”项目给我明确的分步说明吗?

【问题讨论】:

  • 您实际上是否包含了 boost 标头?不应该有-I/usr/include 之类的吗?我相信 boost 测试标头应该为您提供一个主要的... :hmmm: 抱歉,自从我使用 boost::test 以来已经有一段时间了,imo 这有点过度设计
  • 默认情况下,编译器可以包含位于/usr/include的头文件boost/test/unit_test.hpp。因此-I/usr/include 并没有改变任何事情......出于好奇:你最喜欢的单元测试框架是什么? (不是我想开始一场激烈的战争!(^.^))

标签: c++ compiler-errors main boost-test linker-errors


【解决方案1】:

您可能需要在 Boost.Test 包含之前添加 #define BOOST_TEST_DYN_LINK

检查here - 如果库是动态构建的(在许多 Linux 发行版中通常是这样),则需要此宏。它使头文件定义 int main() - 静态链接 main 在静态库中定义,但动态链接要求 main 位于程序的“静态”部分。所以这个宏会让 boost header 'inject' main 到你的 cpp 文件中,编译后它就会在那里。

【讨论】:

  • 是的(几乎!):编译成功,g++ test.cpp -DBOOST_TEST_DYN_LINK -lboost_unit_test_framework!但是运行输出的二进制文件会出现以下错误:Test setup error: test tree is empty,而官方教程显示输出成功:*** No errors detected。 (希望)最后缺少的步骤是什么?
  • 顺便说一句,在/usr/lib/x86_64-linux-gnu/ 我有两个文件libboost_unit_test_framework.solibboost_unit_test_framework.a:这有意义吗?为什么要把选择权留给用户?
  • @GLorieul - 可能教程已过时 - 您需要定义至少一个测试才能看到“未检测到错误”。至于 .a lib - 它可能只是一个加载 .so 的包装器,或者(如您所建议的) - 它适用于那些真正需要静态链接的用户
  • 确实,添加测试解决了我的问题!感谢您的帮助!
  • 顺便说一句,我最初链接到的教程是 Boost::Test 的先前版本 (v 1.43) 的教程。然而,它的内容在本教程中都没有更新,相对于 [我正在使用的版本 (1.54)][1] 也没有更新到关于 [最新版本 (1.59)][2] 的教程中。 [1] boost.org/doc/libs/1_54_0/libs/test/doc/html/tutorials/… [2] boost.org/doc/libs/1_59_0/libs/test/doc/html/boost_test/…
【解决方案2】:

注意:以下过程基于@Hcorg 的回答和 cmets 中的后续讨论。

第 1 步:安装依赖项

就我而言(Linux Mint 17.0 Qiana):

sudo aptitude install libboost-test-dev

这将安装头文件(包libboost-test1.54-dev)和二进制文件(包libboost-test1.54.0)。

正在安装静态 (*.a) 和动态 (.so) 库文件,这让用户(或编译器)可以选择使用其中一个。

步骤#2:创建要编译的源文件

创建一个名为test.cpp 的文件,其中包含:

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

BOOST_AUTO_TEST_CASE(dummy) {
    BOOST_CHECK(1 + 1 == 2);
}

如果您使用的是 Boost::Test v1.59,则应改为:

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

BOOST_AUTO_TEST_CASE(dummy) {
    BOOST_TEST(1 + 1 == 2);
}

这与official tutorial 中的说明不同(截至今天 2015 年 10 月 15 日)。

第 3 步:编译

通过调用以下任一方法编译源文件:

g++ test.cpp -DBOOST_TEST_DYN_LINK -lboost_unit_test_framework

如果您的编译器或您自己决定使用动态库或

g++ test.cpp -lboost_unit_test_framework

如果您的编译器或您自己决定使用静态库。

编译应该静默成功。

步骤#4:运行程序

打电话

./a.out

应该导致以下输出:

Running 1 test case...

*** No errors detected

【讨论】:

    【解决方案3】:

    在您的系统上,aptitude 安装了静态库和共享库,众所周知,在这种情况下,gcc 将更喜欢共享库。 (例如,参见making gcc prefer static libs to shared objects when linking?。)

    因此,您正在使用共享库变体构建您的 boost.test 模块

    这需要在 boost.test 的任何标头之前设置宏 BOOST_TEST_DYN_LINK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2014-08-26
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多