使用Boost.构建和提升.测试链接器错误
Using Boost.Build and Boost.Test - linker errors
我一直在试图弄清楚为什么我的测试不会链接。我用Boost。构建和提升。在Ubuntu上进行Boost 1.59测试。我从源代码构建并安装了boost库。
我指定<library>/boost//unit_test_framework
作为单元测试使用需求的一部分。我的理解是,这应该设置所有的链接器要求,以便与Boost.Test链接。
不幸的是,对于未定义的Boost引用,我得到了一堆链接器错误。测试组件,即使link命令在 test.o
文件之后指定了-lboost_unit_test_framework
。
我有一个非常简单的例子,展示了所描述的行为:
In Jamroot
:
if $(BOOST_ROOT)
{
use-project /boost : $(BOOST_ROOT) ;
}
import boost ;
boost.use-project ;
using testing ;
unit-test test
: test.cpp
: <library>/boost//unit_test_framework
;
In test.cpp
:
#define BOOST_TEST_MODULE test
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE (pass) {
}
运行b2 -d+2
给出了所使用的编译和链接命令。
$ b2 -a -d+2
gcc.compile.c++ bin/gcc-4.9.2/debug/test.o
"g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -std=c++11 -fPIC -DBOOST_ALL_NO_LIB -DBOOST_TEST_DYN_LINK -c -o "bin/gcc-4.9.2/debug/test.o" "test.cpp"
gcc.link bin/gcc-4.9.2/debug/test
"g++" -o "bin/gcc-4.9.2/debug/test" -Wl,--start-group "bin/gcc-4.9.2/debug/test.o" -Wl,-Bstatic -Wl,-Bdynamic -lboost_unit_test_framework -Wl,--end-group -g
bin/gcc-4.9.2/debug/test.o: In function `__static_initialization_and_destruction_0(int, int)':
/home/anthony/Development/example/test.cpp:4: undefined reference to `boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, boost::unit_test::decorator::collector&, unsigned long)'
bin/gcc-4.9.2/debug/test.o: In function `boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long)':
/usr/local/include/boost/test/tree/test_unit.hpp:249: undefined reference to `boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::function<void ()> const&)'
collect2: error: ld returned 1 exit status
...skipped <pbin/gcc-4.9.2/debug>test.passed for lack of <pbin/gcc-4.9.2/debug>test...
...failed updating 1 target...
即使link命令在test.o后面指定了-lboost_unit_test_framework
注意,使用
-Wl,--start-group ...test.o -lboost_unit_test_framework -Wl,--end-group
test.o
和库的顺序并不重要:因为--{start,end}-group
,它们被认为是同一个"书架"的一部分。
必须是libboost_unit_test.{a,so}
不不提供您需要的符号。也许它是用不同版本的g++
构建的?(这个答案可能是相关的。)
你的第一步应该是找出你缺少的符号的混乱名称:将-Wl,--no-demangle
添加到你的链接行。
然后您可以验证您实际上缺少所需的符号:
nm -A libboost_unit_test.* | grep missing_mangled_symbol
最后,你需要理解为什么你错过了那个符号。是否有相似但略有不同的符号定义?下面的命令可以提供一些提示:
nm -AC libboost_unit_test.* | grep 'boost::unit_test::test_case::test_case'
更新:
我刚刚发现不仅g++
的版本在这里很重要,而且编译标志也很重要。考虑:
// foo.cc
#include <string>
void foo(const std::string &) { }
// t.cc
#include <string>
void foo(const std::string &);
int main() { std::string s; foo(s); }
使用最近的GCC trunk:
g++ -c t.cc foo.cc
g++ t.o foo.o # success
g++ -D_GLIBCXX_USE_CXX11_ABI=0 t.cc foo.o
/tmp/ccKqZVvh.o: In function `main':
t.cc:(.text+0x1d): undefined reference to `foo(std::string const&)'
collect2: error: ld returned 1 exit status
相关文章:
- 运行 C++ 单元测试时LNK2005链接错误
- 如何在C++中通过链接器进行模拟测试
- 链接CPP文件进行测试时发生LNK2019错误
- 使用cmake构建google测试单元测试时出现链接器错误
- C++ 使用链接时间替换进行单元测试
- 我无法编译谷歌测试,告诉链接器输入未使用(macOS)
- 在单元测试项目中包括 .c 文件,并从多个 cpp 文件访问它而不会出现链接问题
- 将单元测试添加到旧解决方案时出现链接错误
- 将我的主输出库与测试可执行文件链接时出现问题
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- C++/CLR 托管单元测试存在链接器错误
- C++ / GoogleTest - 如何在链接目录中为每个测试运行安装程序
- Cmake,子目录和Google测试(模拟)无法正确链接.找不到测试
- Qt测试模拟动态链接库
- 难以在测试中链接项目中的对象文件
- 每次捕获测试框架较长的链接时间
- 交叉围栏GCC:在检查动态链接器特征时,在GCC_NO_EXECUTABLES之后不允许链接测试
- cmake - 单元测试++链接单元测试二进制文件失败
- 使用Boost.构建和提升.测试链接器错误
- 增强测试链接