gpt4 book ai didi

c++ - 如何用clang++编译boost单元测试模块?

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:36 24 4
gpt4 key购买 nike

我正在尝试使用 cmake 和 clang 编译 boost 单元测试模块,但遇到了链接器错误。我能够生成以下最小测试用例:

$ cat boost_test_test.cc
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE scanio
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(foo) { BOOST_CHECK(1); }

g++ 可以很好地编译:

$ g++ boost_test_test.cc -lboost_unit_test_framework
$ echo $?
0

但它不适用于clang++:

$ /usr/bin/clang++-3.7 boost_test_test.cc -lboost_unit_test_framework
/tmp/boost_test_test-7e4892.o: In function `boost::unit_test::make_test_case(boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&, boost::unit_test::basic_cstring<char const>)':
boost_test_test.cc:(.text._ZN5boost9unit_test14make_test_caseERKNS0_9callback0INS0_9ut_detail6unusedEEENS0_13basic_cstringIKcEE[_ZN5boost9unit_test14make_test_caseERKNS0_9callback0INS0_9ut_detail6unusedEEENS0_13basic_cstringIKcEE]+0x58): undefined reference to `boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

因此,在链接器阶段,我遇到了一个undefined reference 错误,并且无论clang++ 的参数顺序如何,这个问题仍然存在。

因为它在 g++ 上运行良好,我想这里有一些 clang++ 特定的东西?

这是在 Debian Sid 上使用 g++ 5.2.1、clang++ 3.7 和 boost 1.58。

最佳答案

在 Ubuntu Willy 中,Boost 1.58 单元测试库是使用 GCC 5.0 编译的。库文件libboost_unit_test_framework.a包含错位函数 _ZN5boost9unit_test9ut_detail24normalize_test_case_nameB5cxx11ENS0_13basic_cstringIKcEE解析为 boost::unit_test::ut_detail::normalize_test_case_name[abi:cxx11](boost::unit_test::basic_cstring<char const>)

然而,CLang 似乎没有使用新的 ABI,所以它搜索 _ZN5boost9unit_test9ut_detail24normalize_test_case_nameENS0_13basic_cstringIKcEE ,即 boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>) .

为了克服这个问题,在测试文件中定义你自己的函数:

namespace boost { namespace unit_test { namespace ut_detail {
std::string normalize_test_case_name(const_string name) {
return ( name[0] == '&' ? std::string(name.begin()+1, name.size()-1) : std::string(name.begin(), name.size() ));
}
}}}

这应该可以解决问题。如果使用与 Boost 相同版本的编译器编译,应该没有问题,因为链接器将简单地忽略函数的库版本。

关于c++ - 如何用clang++编译boost单元测试模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32453386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com