我正在尝试运行一个虚拟的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
。