提升::测试:编译和运行"hello world"程序



我正在尝试运行一个虚拟的Boost.test"hello world"程序。我在这里和那里找到了文档,但显然我缺少一些东西......

这是我所做的:

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

按照官方教程中的建议

步骤#3:编译

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

g++ test.cpp -lboost_unit_test_framework

我不是 100% 确定链接库的选项,因为官方教程没有明确提及它。然而,它似乎与我在/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

A. 问题

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

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

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

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

您可能需要

在 Boost.Test include 之前添加#define BOOST_TEST_DYN_LINK

检查这里 - 如果库是动态构建的(在许多 linux 发行版中通常是这样(,则需要此宏。它使头文件定义int main() - 使用静态链接main在静态库中定义,但动态链接要求 main 位于程序的"静态"部分。因此,此宏将使 boost 标头"注入"主要内容到您的 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);
}

这与官方教程中的说明不同(截至今天 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会更喜欢共享库。(例如,请参阅在链接时使 GCC 首选静态库而不是共享对象?

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

  • http://www.boost.org/doc/libs/1_60_0/libs/test/doc/html/boost_test/usage_variants.html#boost_test.usage_variants.shared_lib
  • http://www.boost.org/doc/libs/1_60_0/libs/test/doc/html/boost_test/adv_scenarios/shared_lib_customizations.html

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

相关内容

  • 没有找到相关文章

最新更新