Question

I'm rather new to C++, Boost test, and CMake, so please pardon my stumblings here.

Here is my top level CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(JANKEN)

set ( CMAKE_CXX_COMPILER gcc )
set(CMAKE_CXX_FLAGS "-g -std=c++11 -Wall -Wextra -pedantic -Weffc++")

add_subdirectory(test)
enable_testing()

And here is my CMakeLists.txt in side my test directory, which contains TestRunner.cpp and types_test.cpp

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF)

set(BOOST_LIBS unit_test_framework system)
find_package( Boost REQUIRED COMPONENTS ${BOOST_LIBS})

include_directories( ${Boost_INCLUDE_DIRS}
)

add_executable(
JANKEN_tests
 TestRunner.cpp
 types_test.cpp
)

target_link_libraries(
JANKEN_tests 
${Boost_LIBRARIES}
boost_system-mt
)

TestRunner.cpp looks like

#define BOOST_TEST_DYN_LINK

#define BOOST_TEST_MODULE "JANKEN Unit Tests"
#include <boost/test/unit_test.hpp>

When I run the resulting makefile, I get

piyos-imac:test piyo$ make
-- Boost version: 1.52.0
-- Found the following Boost libraries:
--   unit_test_framework
--   system
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/piyo/Source/janken/build
Linking CXX executable JANKEN_tests
ld: library not found for -lboost_system-mt
collect2: error: ld returned 1 exit status
make[2]: *** [test/types/JANKEN_tests] Error 1
make[1]: *** [test/types/CMakeFiles/JANKEN_tests.dir/all] Error 2
make: *** [all] Error 2

After searching around, I tried adding this line before my add_executable line:

#link_directories ( ${Boost_LIBRARY_DIRS} )

However, adding this results in a giant "Undefined symbols for architecture x86_64" error, complaining about string, ostreams, missing vtables, etc.

I should add that it didn't at first appear that I needed the system library, but leaving that out entirely also yields the giant undefined-symbols error.

Anybody have any idea what I'm doing wrong? I'm on Mountain Lion with gcc 4.7.

Thanks in advance for any help.

Edit to try Kleist's suggestion:

So, if change to this

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF)

set(BOOST_LIBS unit_test_framework system)
find_package( Boost REQUIRED COMPONENTS ${BOOST_LIBS})

include_directories( ${Boost_INCLUDE_DIRS}
)

link_directories ( ${Boost_LIBRARY_DIRS} )

# Create the unit tests executable
add_executable(
JANKEN_tests
 TestRunner.cpp
 types_test.cpp
)

# Link the libraries
target_link_libraries(
JANKEN_tests 
${Boost_LIBRARIES}
)

I get this result

piyos-imac:test piyo$ make
-- Boost version: 1.52.0
-- Found the following Boost libraries:
--   unit_test_framework
--   system
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/piyo/Source/janken/build
Linking CXX executable JANKEN_tests
Undefined symbols for architecture x86_64:
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const", referenced from:
      boost::unit_test::basic_cstring<char const>::basic_cstring(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in types_test.cpp.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const", referenced from:
      boost::unit_test::basic_cstring<char const>::basic_cstring(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in types_test.cpp.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from:
      boost::test_tools::print_log_value<int>::operator()(std::basic_ostream<char, std::char_traits<char> >&, int const&) in types_test.cpp.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*, unsigned long)", referenced from:
      void boost::unit_test::assign_op<char, char const>(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::unit_test::basic_cstring<char const>, int) in TestRunner.cpp.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      boost::unit_test::make_test_case(boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&, boost::unit_test::basic_cstring<char const>) in types_test.cpp.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in TestRunner.cpp.o
      __static_initialization_and_destruction_0(int, int) in types_test.cpp.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in TestRunner.cpp.o
      __static_initialization_and_destruction_0(int, int) in types_test.cpp.o
  "std::__throw_out_of_range(char const*)", referenced from:
      std::array<SideVal, 2ul>::at(unsigned long) const in types_test.cpp.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      operator<<(std::basic_ostream<char, std::char_traits<char> >&, side_t) in types_test.cpp.o
      operator<<(std::basic_ostream<char, std::char_traits<char> >&, SideVal&) in types_test.cpp.o
      boost::unit_test::lazy_ostream_impl<char const (&) [38]>::operator()(std::basic_ostream<char, std::char_traits<char> >&) const in types_test.cpp.o
      boost::unit_test::lazy_ostream_impl<char const (&) [40]>::operator()(std::basic_ostream<char, std::char_traits<char> >&) const in types_test.cpp.o
      boost::unit_test::lazy_ostream_impl<char const (&) [1]>::operator()(std::basic_ostream<char, std::char_traits<char> >&) const in types_test.cpp.o
  "vtable for __cxxabiv1::__class_type_info", referenced from:
      typeinfo for boost::unit_test::test_observer in TestRunner.cpp.o
      typeinfo for boost::unit_test::ut_detail::callback0_impl<boost::unit_test::ut_detail::unused> in types_test.cpp.o
      typeinfo for boost::unit_test::lazy_ostream in types_test.cpp.o
      typeinfo for boost::unit_test::test_observer in types_test.cpp.o
      typeinfo for boost::detail::sp_counted_base in types_test.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for __cxxabiv1::__si_class_type_info", referenced from:
      typeinfo for boost::detail::sp_counted_impl_p<boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()> > in types_test.cpp.o
      typeinfo for boost::unit_test::lazy_ostream_impl<boost::test_tools::tt_detail::print_helper_t<side_t> const&> in types_test.cpp.o
      typeinfo for boost::unit_test::lazy_ostream_impl<boost::test_tools::tt_detail::print_helper_t<int> const&> in types_test.cpp.o
      typeinfo for boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()> in types_test.cpp.o
      typeinfo for boost::unit_test::lazy_ostream_impl<char const (&) [38]> in types_test.cpp.o
      typeinfo for boost::unit_test::lazy_ostream_impl<char const (&) [40]> in types_test.cpp.o
      typeinfo for boost::unit_test::lazy_ostream_impl<char const (&) [1]> in types_test.cpp.o
      ...
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "operator delete(void*)", referenced from:
      boost::unit_test::test_observer::~test_observer() in TestRunner.cpp.o
      boost::unit_test::test_observer::~test_observer() in TestRunner.cpp.o
      boost::unit_test::test_observer::~test_observer() in TestRunner.cpp.o
      boost::unit_test::unit_test_log_t::~unit_test_log_t() in TestRunner.cpp.o
      boost::detail::sp_counted_base::~sp_counted_base() in types_test.cpp.o
      boost::detail::sp_counted_base::~sp_counted_base() in types_test.cpp.o
      boost::detail::sp_counted_base::~sp_counted_base() in types_test.cpp.o
      ...
  "operator new(unsigned long)", referenced from:
      boost::unit_test::make_test_case(boost::unit_test::callback0<boost::unit_test::ut_detail::unused> const&, boost::unit_test::basic_cstring<char const>) in types_test.cpp.o
      boost::unit_test::callback0<boost::unit_test::ut_detail::unused>::callback0<void (*)()>(void (*)()) in types_test.cpp.o
      boost::detail::shared_count::shared_count<boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()> >(boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()>*) in types_test.cpp.o
  "___cxa_begin_catch", referenced from:
      typestest::testside::test_method()     in types_test.cpp.o
      boost::detail::shared_count::shared_count<boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()> >(boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()>*) in types_test.cpp.o
  "___cxa_end_catch", referenced from:
      typestest::testside::test_method()     in types_test.cpp.o
      boost::detail::shared_count::shared_count<boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()> >(boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()>*) in types_test.cpp.o
  "___cxa_guard_acquire", referenced from:
      boost::unit_test::singleton<boost::unit_test::unit_test_log_t>::instance() in TestRunner.cpp.o
      boost::unit_test::lazy_ostream::instance()    in types_test.cpp.o
      boost::unit_test::singleton<boost::unit_test::unit_test_log_t>::instance() in types_test.cpp.o
      boost::unit_test::ut_detail::auto_tc_exp_fail<typestest::testside_id>::instance()      in types_test.cpp.o
  "___cxa_guard_release", referenced from:
      boost::unit_test::singleton<boost::unit_test::unit_test_log_t>::instance() in TestRunner.cpp.o
      boost::unit_test::lazy_ostream::instance()    in types_test.cpp.o
      boost::unit_test::singleton<boost::unit_test::unit_test_log_t>::instance() in types_test.cpp.o
      boost::unit_test::ut_detail::auto_tc_exp_fail<typestest::testside_id>::instance()      in types_test.cpp.o
  "___cxa_pure_virtual", referenced from:
      vtable for boost::unit_test::ut_detail::callback0_impl<boost::unit_test::ut_detail::unused> in types_test.cpp.o
      vtable for boost::detail::sp_counted_base in types_test.cpp.o
  "___cxa_rethrow", referenced from:
      boost::detail::shared_count::shared_count<boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()> >(boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused, void (*)()>*) in types_test.cpp.o
  "___gxx_personality_v0", referenced from:
      Dwarf Exception Unwind Info (__eh_frame) in TestRunner.cpp.o
      Dwarf Exception Unwind Info (__eh_frame) in types_test.cpp.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [test/types/JANKEN_tests] Error 1
make[1]: *** [test/types/CMakeFiles/JANKEN_tests.dir/all] Error 2
make: *** [all] Error 2

This occurs whether I include the link_directories line or not.

EDIT: including make VERBOSE=1 result

piyos-imac:test piyo$ make VERBOSE=1
cd /Users/piyo/Source/janken/build && "/Applications/CMake 2.8-10.app/Contents/bin/cmake" -H/Users/piyo/Source/janken -B/Users/piyo/Source/janken/build --check-build-system CMakeFiles/Makefile.cmake 0
cd /Users/piyo/Source/janken/build && "/Applications/CMake 2.8-10.app/Contents/bin/cmake" -E cmake_progress_start /Users/piyo/Source/janken/build/CMakeFiles /Users/piyo/Source/janken/build/test/CMakeFiles/progress.marks
cd /Users/piyo/Source/janken/build && make -f CMakeFiles/Makefile2 test/all
make -f test/types/CMakeFiles/JANKEN_tests.dir/build.make test/types/CMakeFiles/JANKEN_tests.dir/depend
cd /Users/piyo/Source/janken/build && "/Applications/CMake 2.8-10.app/Contents/bin/cmake" -E cmake_depends "Unix Makefiles" /Users/piyo/Source/janken /Users/piyo/Source/janken/test/types /Users/piyo/Source/janken/build /Users/piyo/Source/janken/build/test/types /Users/piyo/Source/janken/build/test/types/CMakeFiles/JANKEN_tests.dir/DependInfo.cmake --color=
Dependee "/Users/piyo/Source/janken/test/types/types_test.cpp" is newer than depends file "/Users/piyo/Source/janken/build/test/types/CMakeFiles/JANKEN_tests.dir/depend.internal".
Clearing dependencies in "/Users/piyo/Source/janken/build/test/types/CMakeFiles/JANKEN_tests.dir/depend.make".
Scanning dependencies of target JANKEN_tests
make -f test/types/CMakeFiles/JANKEN_tests.dir/build.make test/types/CMakeFiles/JANKEN_tests.dir/build
"/Applications/CMake 2.8-10.app/Contents/bin/cmake" -E cmake_progress_report /Users/piyo/Source/janken/build/CMakeFiles 2
[ 50%] Building CXX object test/types/CMakeFiles/JANKEN_tests.dir/types_test.cpp.o
cd /Users/piyo/Source/janken/build/test/types && gcc    -g -std=c++11 -Wall -Wextra -pedantic -Weffc++   -o CMakeFiles/JANKEN_tests.dir/types_test.cpp.o -c /Users/piyo/Source/janken/test/types/types_test.cpp
/Users/piyo/Source/janken/test/types/types_test.cpp:12:1: warning: base class 'struct boost::unit_test::ut_detail::nil_t' has a non-virtual destructor [-Weffc++]
Linking CXX executable JANKEN_tests
cd /Users/piyo/Source/janken/build/test/types && "/Applications/CMake 2.8-10.app/Contents/bin/cmake" -E cmake_link_script CMakeFiles/JANKEN_tests.dir/link.txt --verbose=1
gcc   -g -std=c++11 -Wall -Wextra -pedantic -Weffc++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names   CMakeFiles/JANKEN_tests.dir/TestRunner.cpp.o CMakeFiles/JANKEN_tests.dir/types_test.cpp.o  -o JANKEN_tests  -L/opt/local/lib  /opt/local/lib/libboost_unit_test_framework-mt.dylib /opt/local/lib/libboost_system-mt.dylib 
Undefined symbols for architecture x86_64:
....

I left out the rest of the error since it looks the same as the last error from "Undefined symbols for..." onward.

Was it helpful?

Solution

You have both ${Boost_LIBRARIES} and boost_system-mt in your target_link_libraries. That shouldn't be necessary. Since you included system in you find_package(Boost ...) call, it should also be in ${Boost_LIBRARIES}.

After edit:

It looks like you're building 64-bit. Are your boost libraries 64-bit? Otherwise try to do a 32-bit build instead.

Another update:

I just found this related question: Undefined symbols for architecture x86_64: Which architecture should I use?

Apparently the reason for your error is that you're setting CMAKE_CXX_COMPILER to gcc. It should be g++.

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