Boost :: Test:编译并运行“hello world”程序

时间:2015-10-15 08:17:35

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

我正在尝试运行一个虚拟的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的{​​{1}}文件,但官方boost tutorial没有提到这样的事情......

这个answer建议定义main()宏,但官方的提升教程也没有提到它。这是正确的做法吗?

有人可以给我一些关于如何编写虚拟“hello world”项目的明确分步说明吗?

3 个答案:

答案 0 :(得分:5)

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

检查here - 如果库是构建为动态的(并且通常在许多Linux发行版中都是如此),则需要此宏。它使头文件定义为int main() - 静态链接main在静态库中定义,但动态链接要求主要在静态库中#in;程序的一部分。因此,这个宏将使得提升标题“注入”#39; main进入你的cpp文件,编译完成后就会出现。

答案 1 :(得分:3)

注意:以下程序基于@Hcorg的答案和随后的评论讨论。

步骤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

答案 2 :(得分:1)

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

因此,您正在使用共享库变体

构建boost.test模块

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