静态链接 cppunit 时如何解决 "undefined reference" 错误?

How to resolve "undefined reference" error while statically linking cppunit?

我不确定为什么这个问题被标记为 Why does the order in which libraries are linked sometimes cause errors in GCC? 的重复问题。那个问题和这个问题是两个完全不同的问题。

我在我的 Debian 系统上安装了 libcppunit-devapt-get

$ dpkg -l libcppunit-dev
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                       Version            Architecture       Description
+++-==========================-==================-==================-==========================================================
ii  libcppunit-dev             1.13.2-2.1         amd64              Unit Testing Library for C++

$ dpkg -L libcppunit-dev | grep "libcppunit\."
/usr/lib/x86_64-linux-gnu/libcppunit.a
/usr/lib/x86_64-linux-gnu/libcppunit.so

我写了一个简单的测试。因为我现在只关心链接 cppunit,所以我还没有测试运行器。暂时忽略缺少测试运行程序。这是我的 test.cpp:

#include <cppunit/extensions/HelperMacros.h>
#include <iostream>

class FooTest : public CppUnit::TestFixture
{
protected:
    void testFoo()
    {
        CPPUNIT_ASSERT_EQUAL(1 + 1, 2);
    }

private:
    CPPUNIT_TEST_SUITE(FooTest);
    CPPUNIT_TEST(testFoo);
    CPPUNIT_TEST_SUITE_END();
};

CPPUNIT_TEST_SUITE_REGISTRATION(FooTest);

int main()
{
    std::cout << "hello\n";
    return 0;
}

动态链接工作正常:

$ g++ -lcppunit test.cpp && ./a.out
hello

静态链接失败:

$ g++ -l:libcppunit.a test.cpp
/tmp/ccwMWIsX.o: In function `CppUnit::AdditionalMessage::~AdditionalMessage()':
test.cpp:(.text._ZN7CppUnit17AdditionalMessageD2Ev[_ZN7CppUnit17AdditionalMessageD5Ev]+0x14): undefined reference to `CppUnit::Message::~Message()'
/tmp/ccwMWIsX.o: In function `FooTest::testFoo()':
test.cpp:(.text._ZN7FooTest7testFooEv[_ZN7FooTest7testFooEv]+0x70): undefined reference to `CppUnit::SourceLine::SourceLine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
test.cpp:(.text._ZN7FooTest7testFooEv[_ZN7FooTest7testFooEv]+0xa5): undefined reference to `CppUnit::SourceLine::~SourceLine()'
test.cpp:(.text._ZN7FooTest7testFooEv[_ZN7FooTest7testFooEv]+0xe9): undefined reference to `CppUnit::SourceLine::~SourceLine()'
/tmp/ccwMWIsX.o: In function `FooTest::getTestNamer__()':
test.cpp:(.text._ZN7FooTest14getTestNamer__Ev[_ZN7FooTest14getTestNamer__Ev]+0x41): undefined reference to `CppUnit::TestNamer::TestNamer(std::type_info const&)'

如何确保与 cppunit 的静态链接成功?

尝试link您的程序和库的另一个顺序

g++ test.cpp -l:libcppunit.a

或者

g++ test.cpp /usr/lib/x86_64-linux-gnu/libcppunit.a

g++ test.cpp -static -lcppunit -Wl,-Bdynamic

需要最后一个 -Wl,-Bdynamic 以避免 libc++ 或 glibc 等系统库的静态link老化。