Рассмотрим эту простую программу:
#include <string>
#include <iostream>
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "MyTest"#include <boost/test/unit_test.hpp>
using namespace std;
template<char* S>
void Test()
{
BOOST_REQUIRE("Boom!" != string(S));
}
char bang[] = "Bang!";
BOOST_AUTO_TEST_CASE(Boom)
{
char boom[] = "Boom!";
Test<bang>();
}
Я на Mac OS X v10.8.2 (Горный лев) и есть XCode 4.5 установлен.
Программа работает при компиляции с НКУ, например,
gcc test.cpp -lboost_unit_test_framework-mt -lstdc++
но он падает при компиляции с Apple лязг 4.1 (теги / Apple / Clang-421.11.65) (на основе LLVM 3.1svn)
clang -std=c++11 -stdlib=libc++ -lc++ test.cpp -lboost_unit_test_framework-mt
Я использую Boost 1.51.0, установленный с помощью BREW. Перекомпиляция Boost с использованием Clang не помогает.
Есть ли решение этой загадки?
./a.out
Running 1 test case...
*** No errors detected
Segmentation fault: 11
gdb ./a.out
GNU gdb 6.3.50-20050815 (Apple version gdb-1822) (Sun Aug 5 03:00:42 UTC 2012)
...
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .... done
(gdb) r
Starting program: /private/tmp/xx/a.out
Reading symbols for shared libraries +++............................. done
Running 1 test case...
*** No errors detected
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
0x0000000100056c56 in boost::unit_test::test_unit::~test_unit ()
(gdb) where
#0 0x0000000100056c56 in boost::unit_test::test_unit::~test_unit ()
#1 0x000000010002435f in boost::unit_test::master_test_suite_t::~master_test_suite_t ()
#2 0x00000001000244dd in boost::unit_test::framework_impl::~framework_impl ()
#3 0x00007fff96179307 in __cxa_finalize ()
#4 0x00007fff9617af57 in exit ()
#5 0x00007fff944897e8 in start ()
lldb a.out
Current executable set to 'a.out' (x86_64).
(lldb) r
Process 71553 launched: '/private/tmp/xx/a.out' (x86_64)
Running 1 test case...
*** No errors detected
Process 71553 stopped
* thread #1: tid = 0x1c03, 0x0000000100056c56 libboost_unit_test_framework.dylib`boost::unit_test::test_unit::~test_unit() + 86, stop reason = EXC_BAD_ACCESS (code=13, address=0x0)
frame #0: 0x0000000100056c56 libboost_unit_test_framework.dylib`boost::unit_test::test_unit::~test_unit() + 86
libboost_unit_test_framework.dylib`boost::unit_test::test_unit::~test_unit() + 86:
-> 0x100056c56: lock
0x100056c57: xaddl %ecx, -8(%rax)
0x100056c5b: testl %ecx, %ecx
0x100056c5d: jg 0x100056c68 ; boost::unit_test::test_unit::~test_unit() + 104
clang --version
Apple clang version 4.1 (tags/Apple/clang-421.11.65) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
Перекомпиляция Boost с опциями C ++ 11 делает свое дело.
./bootstrap.sh --with-toolset=clang --prefix=/usr/local
sudo ./b2 install toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-stdlib=libc++" threading=multi
Я сделал ошибку, используя просто ./b2 install
в последний раз, но, кажется, шаг установки создает некоторые библиотеки перед их установкой.
У меня была та же проблема, что и у Тимлукина.
Я должен был сделать cmake .. -DBoost_USE_STATIC_LIBS=YES
, Но так как у меня были другие проблемы, например, при компиляции с boost_timer, я обнаружил, что это было мое некорректное включение.
Я должен был заменить:
#include <boost/test/included/unit_test.hpp>
с:
#include <boost/test/unit_test.hpp>
Он работал нормально с GCC и VS13, но не с Clang.
Если это может помочь …
Кажется, что следующее работает, но вам могут понадобиться другие аргументы.
USER (~/tmp)
$ clang++ -pedantic test.cpp -lboost_unit_test_framework-mt
USER (~/tmp)
$ ./a.out
Running 1 test case...
*** No errors detected