gcc 4.1.2 & (VC8 + boost::tr1) auf gleicher source
-
Für mein Software-Projekt, das sowohl mit dem MS VC8 (Win) als auch mit dem GCC (Linux) übersetzt werden soll, möchte ich den(?) TR1 einsetzen.
Mein Ansatz war, beim GCC die native Implementierung einzusetzen und beim VC 8 die boost Version einzusetzen. Das ganze hat nur ein Problem: Der GCC hat seine tr1 - header in einem Unterverzeichnis tr1/, sodass die includes statt
#include <memory>
so aussehen:
#include <tr1/memory>
Boost liefert aber ersteres Verhalten.
Ein hinzufügen der Pfades (/usr/include/c++/4.1/tr1) zu den Search-Directories bringt leider mit dem gcc (g++) einige Linkerfehler:
/usr/include/c++/4.1/tr1/functional: In member function »size_t std::tr1::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator()(const std::string&) const«: /usr/include/c++/4.1/tr1/functional:1194: Fehler: invalid use of undefined type »const struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stringfwd.h:56: Fehler: declaration of »const struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >« /usr/include/c++/4.1/tr1/functional:1194: Fehler: invalid use of undefined type »const struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stringfwd.h:56: Fehler: declaration of »const struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >« /usr/include/c++/4.1/tr1/functional: In member function »size_t std::tr1::hash<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >::operator()(const std::wstring&) const«: /usr/include/c++/4.1/tr1/functional:1205: Fehler: invalid use of undefined type »const struct std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stringfwd.h:56: Fehler: declaration of »const struct std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >« /usr/include/c++/4.1/tr1/functional:1206: Fehler: invalid use of undefined type »const struct std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stringfwd.h:56: Fehler: declaration of »const struct std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >«
Beispiel auch hier mit
#include <memory>
Hat jemand hier damit Erfahrungen wie ich den Konflikt lösen kann ohne für jeden Header einen Projektinternen zu erstellen der auf den jeweils richtigen tr1-Header zeigt oder einer Fallunterscheidung für jedes Inkludieren eines tr1-Headers?
-
wie wärs wenn du eine memory_all_platforms.h machst:
#ifdef MSVC #include <memory> #else #include <tr1/memory> #endif
und die dann überall inkludierst?
-
Ich weiß, währe eine der angedachten Notlösungen. Allerdings würde ich einen Weg bevorzugen, der nicht für jeden TR1-Header extra-Behandlung benötigt (Ja das kann man bestimmt mit einem kleinen Script automatisch erstellen, aber trotzdem ...)
-
darthdespotism schrieb:
Ich weiß, währe eine der angedachten Notlösungen. Allerdings würde ich einen Weg bevorzugen, der nicht für jeden TR1-Header extra-Behandlung benötigt (Ja das kann man bestimmt mit einem kleinen Script automatisch erstellen, aber trotzdem ...)
stell dich nicht so an
for f in ["array", "cmath", "complex", "functional", "memory", "random", "regex", "tuple", "type_traits", "unordered_map", "unordered_set", "utility"]: open(f + "_all_platforms.h", 'w').write("#ifdef MSVC\n#include <"+f+">\n#else\n#include <tr1/"+f+">\n#endif")
-
borg schrieb:
for f in ["array", "cmath", "complex", "functional", "memory", "random", "regex", "tuple", "type_traits", "unordered_map", "unordered_set", "utility"]: open(f + "_all_platforms.h", 'w').write("#ifdef MSVC\n#include <"+f+">\n#else\n#include <tr1/"+f+">\n#endif")
Python, richtig?
-
darthdespotism schrieb:
borg schrieb:
for f in ["array", "cmath", "complex", "functional", "memory", "random", "regex", "tuple", "type_traits", "unordered_map", "unordered_set", "utility"]: open(f + "_all_platforms.h", 'w').write("#ifdef MSVC\n#include <"+f+">\n#else\n#include <tr1/"+f+">\n#endif")
Python, richtig?
richtig, als toll.py speichern und in dem verzeichnis, wo die header hinsollen mit python toll.py ausführen.