Libary auf Compiler anpassen

05/04/2016 22:04 Krabat2#1
Hallo :)
Viele Libarys funktionieren ja nur für bestimmte Compiler....

Manche nur für Visual Studio manche nur für Cygwin manche nur für Mingw und manche funktionieren teilweise :/ Deshalb entstehen oft Probleme wenn ich mehrer Libaries benutzen will.
Gibt es eine Möglichkeit die Libaries neu zu bauen für den Compiler? Leute mit eigenem Compiler müssen dass doch auch hinkriegen, oder?

Vielleicht auch einfach nur Stichworte geben dass ich selber recherchieren kann, stehe bloß etwas auf dem Schlauch.
05/04/2016 23:19 florian0#2
Um welche Libraries geht es? Generell sind eigentlich alle Libraries compilerübergreifend kompatibel. Wäre ja auch bescheuert, wenn man für jeden Compiler anderen Code schrieben müsste, dafür gibts ja extra die C++ Standards.

Was du warscheinlich meinst, sind die Projekteinstellungen / Compile-schritte (Makefile vs. Visual Studio Projekt). Das zu portieren ist manchmal gar nicht so einfach.
05/05/2016 00:04 Shadow992#3
Quote:
Originally Posted by florian0 View Post
Um welche Libraries geht es? Generell sind eigentlich alle Libraries compilerübergreifend kompatibel. Wäre ja auch bescheuert, wenn man für jeden Compiler anderen Code schrieben müsste, dafür gibts ja extra die C++ Standards.

Was du warscheinlich meinst, sind die Projekteinstellungen / Compile-schritte (Makefile vs. Visual Studio Projekt). Das zu portieren ist manchmal gar nicht so einfach.
Tatsächlich ist das manchnaml gar nicht so einfach. Ich selbst bekomme zum Beispiel auch noch regelmäßig Probleme, wenn ich "*.lib" files in meinen GNU unter Windows linken will. Offiziell werden lib Dateien zwar unterstützt, aber ich hatte auch schon genug fälle in denen lediglich das neukompilieren vom Source aus geholfen hat.

Kann also schon durchaus manchmal Probleme machen, in 90% der Fälle sollte es aber echt einwandfrei laufen.
05/05/2016 01:01 Krabat2#4
Dann denke ich mal dass ich die libaries neukompilieren muss, ich werde mal etwas googlen

Brauche ich dafür CMake? Das habe ich in manchen Installations Dokumentationen gelesen
05/06/2016 13:32 Krabat2#5
#push da mein Nachtrag an mein alten Beitrag angefügt wurde und manche vlt nur den alten gelesen haben.

Quote:
Brauche ich dafür CMake? Das habe ich in manchen Installations Dokumentationen gelesen
05/06/2016 14:32 th0rex#6
Wenn CMake als build system von der Library genutzt wird brauchst du das. Und wenn davon was in den Installations dokumenten steht wird die Library das wohl benutzen. Falls du irgendwo nicht weiter kommst kannst du ja entweder hier was genaueres fragen und den namen der Library nennen oder Leute fragen, die an der Library arbeiten.
05/06/2016 15:09 MrSm!th#7
Quote:
Originally Posted by florian0 View Post
Um welche Libraries geht es? Generell sind eigentlich alle Libraries compilerübergreifend kompatibel. Wäre ja auch bescheuert, wenn man für jeden Compiler anderen Code schrieben müsste, dafür gibts ja extra die C++ Standards.

Was du warscheinlich meinst, sind die Projekteinstellungen / Compile-schritte (Makefile vs. Visual Studio Projekt). Das zu portieren ist manchmal gar nicht so einfach.
Das ist absolut nicht der Fall, nein. Zum einen sind die generierten Binaries in der Regel nicht zwischen den diversen Compilern und Linkern kompatibel (teilweise nicht mal zwischen unterschiedlichen Versionen des gleichen Compilers). Darüber schreibt der Standard auch gar nichts vor. Und dann hat auch noch jeder Compiler zig Extensions, die bestimmte Code-Konstrukte erlauben, die nur mit diesem Compiler funktionieren. Auch die Verwendung solcher Extensions ist keine Seltenheit.

Davon abgesehen enthalten die Standardbibliotheken vergleichsweise sehr wenig Funktionalität und sobald du externe Abhängigkeiten hast (z.B. zur Win32 API), ist der Code nicht mehr plattformübergreifend. Dann musst du in der Tat für jede Plattform (und das ist in der Regel der Grund, wieso man verschiedene Compiler nutzt) anderen Code schreiben.

Die einzige Möglichkeit, C++ Bibliotheken zuverlässig und (möglichst) für alle Compiler bereitzustellen, ist in Quellcode-Form. Benutzer einer Bibliothek müssen den Code dann einmal selbst passend für ihren Compiler compilen. Andernfalls (z.B. bei closed-source Bibliotheken) ist man darauf angewiesen, dass für den jeweiligen Compiler (und dessen Version) auch ein passendes Binary zur Verfügung gestellt wird.
05/06/2016 15:29 florian0#8
Quote:
Originally Posted by MrSm!th View Post
Das ist absolut nicht der Fall, nein. Zum einen sind die generierten Binaries in der Regel nicht zwischen den diversen Compilern und Linkern kompatibel (teilweise nicht mal zwischen unterschiedlichen Versionen des gleichen Compilers). Darüber schreibt der Standard auch gar nichts vor. Und dann hat auch noch jeder Compiler zig Extensions, die bestimmte Code-Konstrukte erlauben, die nur mit diesem Compiler funktionieren. Auch die Verwendung solcher Extensions ist keine Seltenheit.
Korrekt! Ich ging von reinem Quellcode aus, nicht von vorkompilierten lib-files. Hätte ich vll. dazu-schreiben sollen^^
05/06/2016 16:55 Shadow992#9
Quote:
Originally Posted by florian0 View Post
Korrekt! Ich ging von reinem Quellcode aus, nicht von vorkompilierten lib-files. Hätte ich vll. dazu-schreiben sollen^^
Ja ich weiß, du hast dich bestimmt nur falsch ausgedrückt, aber um auf Nummer sicher zu gehen und eventuellen Googlern Klarheit zu verschaffen:

Nicht einmal der Quellcode wird in vielen Projekten (selbst großen Open-Source Projekten) Compilerübegreifend geschrieben, selbst wenn man es auf derselben Plattform kompiliert.

Das fängt bei Macros wie "#pragma-once" an, geht über "GNU 128-Bit"-Extension bis hin zu unterschiedlichen ABIs (das mag auf den ersten Blick keinen Sinn ergeben, wenn man sich aber darauf verlässt, dass man eine bestimmte ABI vorliegen hat und darauf basierend "MAGIC" macht, kanns schnell krachen wenn sich was ändert).

Die ersten zwei Punkte lassen sich natürlich bei strikter Einhaltung des Standards weitestgehend eliminieren, wobei dann wiederum neue Probleme auftreten ala "Not implemented yet" u.ä.
Punkt 3 ist eigentlich auch vermeidbar, jedoch nicht indem man sich an den Standard hält (denn dieser, so viel ich weiß, macht keinerlei Aussagen über die ABI), sondern indem man sich nicht auf "Design-Fragen" verlässt. Und mal ehrlich, wie oft gibt es wirklich keine andere Möglichkeit als im Call-Stack o.ä. rumzupfuschen? Vielleicht in einem von 1000 Fällen...

Alles in allem:
Wenn man sich an den Standard hält, hat man gute Chancen, dass der Source-Code überall kompiliert, ein Garant ist es jedoch mit Nichten.
05/07/2016 15:03 MrSm!th#10
Quote:
Punkt 3 ist eigentlich auch vermeidbar, jedoch nicht indem man sich an den Standard hält (denn dieser, so viel ich weiß, macht keinerlei Aussagen über die ABI)
Nun ja, das ist ja der Punkt. Man verlässt sich nicht auf undefiniertes Verhalten, also vermeidet man das Problem, indem man sich ausschließlich an den Standard hält :p Letztendlich ist man in C/C++ aber hochgradig eingeschränkt, wenn man sich nur exakt an das hält, was im Standard steht. Man kommt bei so einer low-level Sprache ganz einfach nicht drum herum, sich mit der Plattform zu beschäftigen, für die man programmieren möchte.

Quote:
Wenn man sich an den Standard hält, hat man gute Chancen, dass der Source-Code überall kompiliert, ein Garant ist es jedoch mit Nichten.
Auch wenn er es tut, weißt du nicht sicher, ob das Programm funktioniert, wie es soll. Es ist auf den gängigen Plattformen zwar der Fall, aber eben nicht von der Sprache garantiert. Wenn z.B. die Endianess anders ist als erwartet, wird diverse Logik im Code vielleicht schon komplett falsch.
05/08/2016 14:51 Krabat2#11
Zum Beispiel in der Dokumentation von libcurl steht "then run 'mingw32-make mingw32' in the root dir."
Heißt das ich muss immer diesen Befehl ausführen wenn ich eine libary compilen will?

Und macht es einen Unterschied ob ich mingw oder mingw-64 benutze?

Und letzte Frage, muss ich i686-w64-mingw32-g++.exe, oder g++.exe benuzten? (genauso mit den anderen z.B. ar.exe)