Ich habe einen Versuch auf den minimalen Testfall gemacht. Dieser Fall gibt rhel-7 mit devtoolset-4 (gcc-5.2) weiter und scheitert unter rhel-6. Status -2 bedeutet "Mangled_name ist kein gültiger Name unter den C++ ABI Mangelregeln." https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html__cxa_demangle scheitert an rhel6 (centos6) mit devtoolset-4 gcc-5.2
Mache ich alles falsch oder ist das ein Fehler, muss ich irgendwie arbeiten, wenn ich gcc-5.2 auf RHEL-6 verwenden möchte? Wenn ja, irgendwelche Empfehlungen? Mein bester Gedanke ist bisher, "IJ" in dem entstellten Namen zu "II" zu regexieren, bevor es zu __cxa_demangle() gegeben wird. Wenn das wahrscheinlich relativ zuverlässig ist, kann ich damit leben.
#include <iostream>
#include <string>
#include <tuple>
#include <typeinfo>
#include <cxxabi.h>
#define DUMP(x) std::cout << #x << " is " << x << std::endl
template<typename T>
void print_type(T t)
{
int status;
auto name = typeid(t).name();
DUMP(name);
auto thing2 = abi::__cxa_demangle(name, 0, 0, &status);
if(status == 0)
{
DUMP(thing2);
}
else
{
std::cout << typeid(t).name() << " failed to demangle\n";
DUMP(status);
}
}
typedef std::tuple<foo_t, foo_t> b_t;
int main(int argc, char **argv)
{
std::tuple<bool, bool> t;
print_type(t);
}
Centos-6-Ausgang
name is St5tupleIJbbEE
St5tupleIJbbEE failed to demangle
status is -2
Centos-7 Ausgang
name is St5tupleIJbbEE
thing2 is std::tuple<bool, bool>
Centos-6-Ausgang mit devtoolset-3 (gcc-4,9)
name is St5tupleIIbbEE
thing2 is std::tuple<bool, bool>
Gab es keinen ABI-Wechsel zwischen gcc 4 und 5? Ich bin kein Experte, aber ich erinnere mich, dass meine Kollegin darüber gesprochen hat. –