我正在尝试运行一个虚拟的Boost.test“hello world”程序。我找到了文档here和there,但显然我遗漏了一些内容......
这就是我所做的:
sudo aptitude install libboost-test-dev
安装标头(libboost-test1.54-dev
)和二进制文件(libboost-test1.54.0
)。
我有一个名为test.cpp
的文件,其中包含:
#define BOOST_TEST_MODULE const_string test
#include <boost/test/unit_test.hpp>
// EOF
中所建议的那样
我通过调用:
编译我的代码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”项目的明确分步说明吗?
答案 0 :(得分:5)
您可能需要在Boost.Test包括之前添加#define BOOST_TEST_DYN_LINK
。
检查here - 如果库是构建为动态的(并且通常在许多Linux发行版中都是如此),则需要此宏。它使头文件定义为int main()
- 静态链接main
在静态库中定义,但动态链接要求主要在静态库中#in;程序的一部分。因此,这个宏将使得提升标题“注入”#39; main进入你的cpp文件,编译完成后就会出现。
答案 1 :(得分:3)
注意:以下程序基于@Hcorg的答案和随后的评论讨论。
就我而言(Linux Mint 17.0 Qiana):
sudo aptitude install libboost-test-dev
这将安装标头(包libboost-test1.54-dev
)和二进制文件(包libboost-test1.54.0
)。
正在安装静态(*.a
)和动态(.so
)库文件,这使得用户(或编译器)可以选择使用它们。
创建一个名为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日)的说明不同。
通过调用:
编译源文件g++ test.cpp -DBOOST_TEST_DYN_LINK -lboost_unit_test_framework
如果您的编译器或您自己决定使用动态库或
g++ test.cpp -lboost_unit_test_framework
如果您的编译器或您自己决定使用静态库。
编译应该默默成功。
调用
./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
。