I am getting a segmentation fault when attempting to use Boost.Test. I suspect that I don't have something set up correctly -- your assistance in remedying this would be appreciated. I am using clang++-mp-3.3 as installed by MacPorts on OS X 10.8.4. Here's the crash, which occurs after Boost.Test reports "*** No errors detected".
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
0x000000010006f6d6 in boost::unit_test::test_unit::~test_unit ()
(gdb) bt
#0 0x000000010006f6d6 in boost::unit_test::test_unit::~test_unit ()
#1 0x000000010003bb5f in boost::unit_test::master_test_suite_t::~master_test_suite_t ()
#2 0x000000010003bcdd in boost::unit_test::framework_impl::~framework_impl ()
#3 0x00007fff8f465307 in __cxa_finalize ()
#4 0x00007fff8f466f57 in exit ()
#5 0x00007fff96ddc7e8 in start ()
(gdb)
Here's a somewhat simplified version of what I have:
==== UseBoostUnitTestFramework.hpp ====
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wall"
#pragma clang diagnostic ignored "-Wdisabled-macro-expansion"
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#pragma clang diagnostic ignored "-Wextra-semi"
#pragma clang diagnostic ignored "-Wglobal-constructors"
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#pragma clang diagnostic ignored "-Wsign-conversion"
#pragma clang diagnostic ignored "-Wundef"
#pragma clang diagnostic ignored "-Wweak-vtables"
#include <boost/test/unit_test.hpp>
#pragma clang diagnostic pop
==== HaveBoostUnitTestFrameworkDefineMain.cpp ====
#define BOOST_TEST_MODULE All_Tests
#include "UseBoostUnitTestFramework.hpp"
/* commenting out the next 3 lines makes no difference */
namespace boost { namespace unit_test { namespace framework {
master_test_suite_t & master_test_suite();
} } } // namespace boost::unit_test::framework
==== CMakeLists.txt ====
cmake_minimum_required(VERSION 2.8.10 FATAL_ERROR)
cmake_policy(VERSION 2.8.10)
project (Foo)
add_definitions(-DBOOST_TEST_DYN_LINK)
add_library (foo SHARED
Foo1.hpp
more files...
UseBoostUnitTestFramework.hpp
Foo1.cpp
more files...
)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
file(GLOB_RECURSE test_source_files *.unit_tests.cpp)
link_directories(${Boost_LIBRARY_DIRS})
add_executable(all_tests
HaveBoostUnitTestFrameworkDefineMain.cpp ${test_source_files})
target_link_libraries(all_tests
foo
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)
set(CTEST_OUTPUT_ON_FAILURE TRUE)
enable_testing()
add_test(all_tests all_tests)
set(CMAKE_C_COMPILER "clang-mp-3.3")
set(CMAKE_C_FLAGS "-Weverything --std=c11 -O3 -DNDEBUG")
set(CMAKE_CXX_COMPILER "clang++-mp-3.3")
set(CMAKE_CXX_FLAGS "-ferror-limit=1 --std=c++1y -stdlib=libc++ -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded -O3 -DNDEBUG")
==== Foo1.hpp ====
(has declarations, but nothing that depends on Boost at all -- nor does any other non-test file)
==== Foo1.cpp ====
(has definitions, but nothing that depends on Boost at all -- nor does any other non-test file)
====Foo1.unit_tests.cpp ====
#include "Foo1.hpp"
#include <string>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"
#include "UseBoostUnitTestFramework.hpp"
BOOST_AUTO_TEST_SUITE(Bar1)
BOOST_AUTO_TEST_CASE(foobar1) {
BOOST_CHECK_EQUAL(std:string("a"), std::string("a"));
}
BOOST_AUTO_TEST_CASE(foobar2) {
BOOST_CHECK_EQUAL(true, true);
}
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE(Bar2)
BOOST_AUTO_TEST_CASE(barfoo1) {
BOOST_CHECK_EQUAL(1, 1);
}
BOOST_AUTO_TEST_CASE(barfoo2) {
BOOST_CHECK_EQUAL(0, 0);
}
BOOST_AUTO_TEST_SUITE_END()
#pragma clang diagnostic pop