Question

Many questions have been asked with this title, but I found no answers working for me...

I have the following code:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Hello
#include <boost/test/unit_test.hpp>

int add(int i, int j)
{
    return i + j;
}

BOOST_AUTO_TEST_CASE(universeInOrder)
{
    BOOST_CHECK(add(2, 2) == 4);
}

And I compile with:

g++ -ohello -lboost_unit_test_framework hello.cpp

The error I get:

g++ -ohello -lboost_unit_test_framework hello.cpp
/usr/bin/ld: error: cannot find -lboost_unit_test_framework
/tmp/ccI94F8l.o:hello.cpp:function init_unit_test(): error: undefined reference to 'boost::unit_test::framework::master_test_suite()'
/tmp/ccI94F8l.o:hello.cpp:function main: error: undefined reference to 'boost::unit_test::unit_test_main(bool (*)(), int, char**)'
/tmp/ccI94F8l.o:hello.cpp:function universeInOrder::test_method(): error: undefined reference to 'boost::unit_test::unit_test_log_t::set_checkpoint(boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::basic_cstring<char const>)'
/tmp/ccI94F8l.o:hello.cpp:function universeInOrder::test_method(): error: undefined reference to 'boost::test_tools::tt_detail::check_impl(boost::test_tools::predicate_result const&, boost::unit_test::lazy_ostream const&, boost::unit_test::basic_cstring<char const>, unsigned long, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_detail::check_type, unsigned long, ...)'
/tmp/ccI94F8l.o:hello.cpp:function __static_initialization_and_destruction_0(int, int): error: undefined reference to 'boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)'
/tmp/ccI94F8l.o:hello.cpp:function boost::unit_test::unit_test_log_t::unit_test_log_t(): error: undefined reference to 'vtable for boost::unit_test::unit_test_log_t'
/tmp/ccI94F8l.o:hello.cpp: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>): error: undefined reference to 'boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)'
/tmp/ccI94F8l.o:hello.cpp: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>): error: undefined reference to 'boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&)'
/tmp/ccI94F8l.o:hello.cpp:function boost::unit_test::unit_test_log_t::~unit_test_log_t(): error: undefined reference to 'vtable for boost::unit_test::unit_test_log_t'
collect2: ld returned 1 exit status

Simple example comes from http://www.alittlemadness.com/2009/03/31/c-unit-testing-with-boosttest/ I am also experiencing this problem with another big project, that works fine on other machines... Something must be wrong with my machine configuration, but I have no clue what (or how to debug it!).

Some things I already did:

Check libc.conf:

$ cat /etc/ld.so.conf.d/libc.conf
# libc default configuration
/usr/local/lib

Check if boost file can be read as a user:

$ test -r /usr/local/lib/libboost_unit_test_framework.a && echo ok
ok

$ ll /usr/local/lib/libboost_program_options.a
-rw-r--r-- 1 root root 1.2M May 22  2013 /usr/local/lib/libboost_program_options.a

run ldconfig?

sudo ldconfig

g++ -Wl,--verbose -o hello hello.cpp -lboost_unit_test_framework

/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o succeeded
/usr/bin/ld: Attempt to open /tmp/ccOe343V.o succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /lib/x86_64-linux-gnu/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /lib/x86_64-linux-gnu/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /lib/../lib/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /lib/../lib/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /usr/lib/../lib/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /usr/lib/../lib/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open //lib/x86_64-linux-gnu/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open //lib/x86_64-linux-gnu/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open //usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open //usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open //lib/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open //lib/libboost_unit_test_framework.a failed
/usr/bin/ld: Attempt to open //usr/lib/libboost_unit_test_framework.so failed
/usr/bin/ld: Attempt to open //usr/lib/libboost_unit_test_framework.a failed
/usr/bin/ld: error: cannot find -lboost_unit_test_framework
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libm.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libm.a failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libm.so succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc_s.so succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc.a succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libc.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libc.a failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.so succeeded
/usr/bin/ld: Attempt to open /lib/x86_64-linux-gnu/libc.so.6 succeeded
/usr/bin/ld: Attempt to open /usr/lib/x86_64-linux-gnu/libc_nonshared.a succeeded
/usr/bin/ld: Attempt to open /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc_s.so succeeded
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc.so failed
/usr/bin/ld: Attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.6/libgcc.a succeeded
/tmp/ccOe343V.o:hello.cpp:function init_unit_test(): error: undefined reference to 'boost::unit_test::framework::master_test_suite()'
/tmp/ccOe343V.o:hello.cpp:function main: error: undefined reference to 'boost::unit_test::unit_test_main(bool (*)(), int, char**)'
/tmp/ccOe343V.o:hello.cpp:function universeInOrder::test_method(): error: undefined reference to 'boost::unit_test::unit_test_log_t::set_checkpoint(boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::basic_cstring<char const>)'
/tmp/ccOe343V.o:hello.cpp:function universeInOrder::test_method(): error: undefined reference to 'boost::test_tools::tt_detail::check_impl(boost::test_tools::predicate_result const&, boost::unit_test::lazy_ostream const&, boost::unit_test::basic_cstring<char const>, unsigned long, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_detail::check_type, unsigned long, ...)'
/tmp/ccOe343V.o:hello.cpp:function __static_initialization_and_destruction_0(int, int): error: undefined reference to 'boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, unsigned long)'
/tmp/ccOe343V.o:hello.cpp:function boost::unit_test::unit_test_log_t::unit_test_log_t(): error: undefined reference to 'vtable for boost::unit_test::unit_test_log_t'
/tmp/ccOe343V.o:hello.cpp: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>): error: undefined reference to 'boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)'
/tmp/ccOe343V.o:hello.cpp: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>): error: undefined reference to 'boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&)'
/tmp/ccOe343V.o:hello.cpp:function boost::unit_test::unit_test_log_t::~unit_test_log_t(): error: undefined reference to 'vtable for boost::unit_test::unit_test_log_t'
collect2: ld returned 1 exit status
Was it helpful?

Solution

Something must be wrong with my machine configuration, but I have no clue what (or how to debug it!)

Try,

g++ -Wl,--verbose -o hello hello.cpp -lboost_unit_test_framework

and look for the lines saying: attempt to open ... boost_unit_test_framework. It will give you a better idea for the search paths the linker employs to try and locate the static or dynamic library in question.

OTHER TIPS

I don't know your exact setting (such as env variables, whether both shared/static libraries exist, etc..), so I am giving various options which I think possible. Hope this fixes your problem, and let me know all fail.

  • run $ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH. This specify to use /usr/local/bin, which is often ignored.

  • run $ g++ -ohello /usr/local/lib/libboost_unit_test_framework.a hello.cpp. This specify exact library location.

  • run $ g++ -ohello -Wl,-Bstatic -lboost_unit_test_framework hello.cpp. This specify to use static library, not dynamic library.

  • specify to use static library. I think boost has #define for that.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top