Boost::Test : 编译和 运行 一个 "hello world" 程序

Boost::Test : Compiling and running a "hello world" program

我正在尝试获取一个虚拟 Boost.test "hello world" 程序 运行。我找到了文档 here and there 但显然我遗漏了一些东西......

这是我所做的:

第 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% 确定 link 库的选项,因为 official tutorial 没有明确提及它。然而,它似乎与我在 /usr/lib 中的库文件名相匹配。另外,linker 不会抱怨找不到共享对象或静态库文件。

其中returns出现以下错误:

/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

问题

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

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

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

有人可以给我关于如何使我的虚拟 "hello world" 项目编译的清晰的分步说明吗?

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

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

注意:以下过程基于@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

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

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

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