Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When switching to C++11, Is it necessary to recompile all dependency libraries that use STL in interface?

Tags:

c++

c++11

stl

I'm attempting to switch a large project to using C++11. I ran into large number of linker errors which seem caused by the mismatched namespace on STL classes between library compiled with C++11 and those compiled with C++03.

As an example, say library B is a dependency of A. B has following templated class as part of its interface.

template <class Type>
class VectorParameter
{
public:
    VectorParameter();
    virtual ~VectorParameter();

    ...
}

Library A instantiates the template with VectorParameter<std::pair<float, float>>.

When I recompiled A with C++11 without recompiling B, I ran into linker error that complains that

LFE::VectorParameter<std::__1::pair<float, float>>::~VectorParameter() is undefined symbol.

I think the issue here is that library A uses std::__1::pair while B still uses std::pair. Following this reasoning, I assume that I will need to recompile all dependency libraries that refers STL types in their interfaces.

If this is the case, then migrating a large project to C++11 will require all involved groups to switch at the same time, which doesn't seem very practical on a complex project. What would be the best practice for dealing this issue?

like image 674
mr49 Avatar asked Jul 11 '14 16:07

mr49


2 Answers

It is almost certain that the library header files have changed, therefore to remain in compliance with the One Definition Rule you must recompile everything.

like image 99
Mark Ransom Avatar answered Nov 17 '22 10:11

Mark Ransom


You don't specify your platform or compiler/libraries.

There are some interesting notes here (although a bit out of date) about ABI compatibility for GNU libStdc++ - there is some insulation from ABI compatibility at the expense of true compliance. It rather looks as if it's all or nothing here if you use std::pair.

libc++ (which is clang's standard library) takes another approach and intentionally inserts an extra namespace (I believe called __1) to all of its exported symbols, which means it's possible to link both libstdc++ and libc++ in the same executable. Providing you're not passing STL objects across the boundaries between your old and new libraries, you may well be able to get this to work.

like image 43
marko Avatar answered Nov 17 '22 09:11

marko