18
votes

I want to use Boost test in my project.

I use cmake in my project so I wrote a simple CMakeList.txt for wrapping it:

find_package (Boost COMPONENTS unit_test_framework REQUIRED)
file(GLOB_RECURSE UnitTests_sources tests/*.cpp)
add_executable(UnitTests
    ${UnitTests_sources}
)
enable_testing()
ADD_TEST (UnitTests UnitTests)

So, cmake works fine here. The trouble becomes during compiling:

Linking CXX executable ../../bin/UnitTests

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../lib/crt1.o: In function _start': (.text+0x20): undefined reference tomain' collect2: ld returned 1 exit status

Here is the only file in tests folder (LogManagerTest.cpp):

#include "Utils/LogManager.hpp"
#include <boost/test/unit_test.hpp>

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN

#define BOOST_TEST_MODULE LogManager

BOOST_AUTO_TEST_CASE(LogManagerCase)
{
    BOOST_REQUIRE(true);
    /*LogManager manager;
    manager.Initialize();
    manager.Deinitialize();*/
}

What's wrong here?

4
Just go to the starter example and then go to the usage variants. If you are not comfortable with linker options, etc... stick to the header only variant of Boost.Test. And yes: changing the order of the macros and includes do have an impact. - Raffi

4 Answers

28
votes

Add

ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 

to your CMakeLists.txt so it will automatically generate a main() for you. Also,

#define BOOST_TEST_MODULE xxx

must be defined before you include unit_test.hpp.

You can find more information and options on: http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/utf/compilation.html

7
votes

You need to compile with -lboost_unit_test_framework, boost generates the main for you if you use the BOOST_TEST_DYN_LINK so you need to tell the makefile to look for that main. Then you can compile using the following:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE LogManager                                   
BOOST_AUTO_TEST_CASE(LogManagerCase)                                   
{                                                                      
    BOOST_REQUIRE(true);                                               
    /*LogManager manager;                                              
    manager.Initialize();                                              
    manager.Deinitialize();*/                                          
}                                                                      
BOOST_AUTO_TEST_SUITE_END()    
3
votes

Try moving

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN

before your includes - it worked for me.

0
votes

Once I made a stupid typo and also got this. And compiler was cheated.

Just as "#define BOOTS_TEST_MODULE DUMMY". Yes, I like boots :)