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
中所推荐
第 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 模块
- 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 的任何 headers 之前设置宏 BOOST_TEST_DYN_LINK
。
我正在尝试获取一个虚拟 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
中所推荐
第 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 模块
- 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 的任何 headers 之前设置宏 BOOST_TEST_DYN_LINK
。