Why I had to use-D_GLIBCXX_USE_CXX11_ABI=0 to get a Boost.Test unit test to build and run

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Why I had to use-D_GLIBCXX_USE_CXX11_ABI=0 to get a Boost.Test unit test to build and run

Boost - Users mailing list
This is in the nature of a question, I am wondering *why* I had to use the -D_GLIBCXX_USE_CXX11_ABI=0 setting.

This development is happening on Centos 7, where the system gcc/g++ is 4.8.5. So I recently built and installed gcc/g++ 8.2.0 from source, because I like Linux and prefer to try out C++17 stuff there rather than using a recent Visual Studio. That's just background.

In any case I built the Boost Test module with

./b2 cxxflags="-stdlib=libc++ -std=c++14" linkflags="-stdlib=libc++ -std=c++14"

going off suggestions I found. No evident problems there. After the install, among other things I end up with

/usr/local/lib/libboost_unit_test_framework.so

Now, I attempted to build a unit test with

g++ -std=c++14 DocumentTest.cpp ../src/Document.cpp -I../include -L/usr/local/include -DBOOST_TEST_DYN_LINK -lboost_unit_test_framework

The linker complained about an undefined reference for

boost::unit_test::ut_detail::normalize_test_case_name[abi:cxx11](boost::unit_test::basic_cstring<char const>)

Using nm -D on the shared library I see that the proper export symbol is there. abi:cxx11 seemed to offer some indication as to the problem, which is why after some experimentation I found that adding -D_GLIBCXX_USE_CXX11_ABI=0 to the unit test build command did the trick. The resulting a.out executes just fine (purely for debugging I made sure the unit test had a C++14 feature).

I thought I sort of understood the ABI change business, gcc 5.1 before and after, but I guess I don't. What do I need to do, perhaps at the stage of building a Boost shared library, to not have to use that flag?

Thanks for any wisdom.

Arved Sandstrom


_______________________________________________
Boost-users mailing list
[hidden email]
https://lists.boost.org/mailman/listinfo.cgi/boost-users
Reply | Threaded
Open this post in threaded view
|

Re: Why I had to use-D_GLIBCXX_USE_CXX11_ABI=0 to get a Boost.Test unit test to build and run

Boost - Users mailing list
Are you sure you are actually using the new boost unit test you built, rather than some system installed one? Check with ldd which actual boost_unit_test_framework you are loading when you run the executable.

The other question is when you invoke b2 is it using your custom gcc-8.2 or system gcc-4.8.5?

Cheers,
Andrew


On Sun, Aug 19, 2018 at 12:00 PM Arved Sandstrom via Boost-users <[hidden email]> wrote:
This is in the nature of a question, I am wondering *why* I had to use the -D_GLIBCXX_USE_CXX11_ABI=0 setting.

This development is happening on Centos 7, where the system gcc/g++ is 4.8.5. So I recently built and installed gcc/g++ 8.2.0 from source, because I like Linux and prefer to try out C++17 stuff there rather than using a recent Visual Studio. That's just background.

In any case I built the Boost Test module with

./b2 cxxflags="-stdlib=libc++ -std=c++14" linkflags="-stdlib=libc++ -std=c++14"

going off suggestions I found. No evident problems there. After the install, among other things I end up with

/usr/local/lib/libboost_unit_test_framework.so

Now, I attempted to build a unit test with

g++ -std=c++14 DocumentTest.cpp ../src/Document.cpp -I../include -L/usr/local/include -DBOOST_TEST_DYN_LINK -lboost_unit_test_framework

The linker complained about an undefined reference for

boost::unit_test::ut_detail::normalize_test_case_name[abi:cxx11](boost::unit_test::basic_cstring<char const>)

Using nm -D on the shared library I see that the proper export symbol is there. abi:cxx11 seemed to offer some indication as to the problem, which is why after some experimentation I found that adding -D_GLIBCXX_USE_CXX11_ABI=0 to the unit test build command did the trick. The resulting a.out executes just fine (purely for debugging I made sure the unit test had a C++14 feature).

I thought I sort of understood the ABI change business, gcc 5.1 before and after, but I guess I don't. What do I need to do, perhaps at the stage of building a Boost shared library, to not have to use that flag?

Thanks for any wisdom.

Arved Sandstrom

_______________________________________________
Boost-users mailing list
[hidden email]
https://lists.boost.org/mailman/listinfo.cgi/boost-users

_______________________________________________
Boost-users mailing list
[hidden email]
https://lists.boost.org/mailman/listinfo.cgi/boost-users