Hallo,
eigentlich komme ich eher aus der c# Ecke, möchte mich jetzt aber
intensiver mit c++ auseinandersetzen.
Ein kleines Buch "c++ für Dummies" habe ich mir schon durchgelesen und
bin mittlerweile soweit, dass ich die grundlegenden Dinge hinbekomme...
Um mich vom "Hello-World" Status wegzubewegen wollte ich jetzt mal einen
TCP Client bauen oder auch z.B. mit libcurl eine Seite ansurfen und mir
dort einfach alle Bilder herunterladen.
Libcurl habe ich bis jetzt nicht zum Laufen bekommen, da mir ständig
irgendwelche Abhängigkeiten fehlen und man auf der libcurl Page einfach
nicht einen Download findet wo man die Headerdateien, die Libdatei und
die dll Datei erhält... das ist ja eine Katastrophe oder ich bin einfach
zu unfähig.
Die Lib für Winsock war bei mir in Codeblocks im Standard dabei, auch
wenn ich das erstmal herausfinden musste...
Gibt es sowas wie eine großes libverzeichnis für c++, was diese Probleme
irgendwie löst?
In c# kann ich aus dem Stehgreif die beiden von mir oben genannten
Projekte quasi in Sekundenschnelle schreiben, in c++ theoretisch auch,
aber ich suche unendlich lange nach irgendwelchen Abhängigkeiten und
libs, so arbeitet doch keiner?
Viele Grüße
cppuser schrieb:> bcurl Page einfach nicht einen Download findet wo man die Headerdateien,> die Libdatei und die dll Datei erhält...
Das grundsaetzliche Problem mit c++ ist, dass das ABI nichst
stabil/spezifiziert ist. D.h. nur libs die mit demselben Compiler und
derselben version.erstellt wurden koenneb gelinkt werden
Deswegen.wird sooft ein C Interface.verwendet.
cppuser schrieb:> Gibt es sowas wie eine großes libverzeichnis für c++, was diese Probleme> irgendwie löst?
Unter Linux liefert der Paket Manager nahezu alle Open Source Libraries
frei Haus. Unter Windows hilft NuGet. Schau dir auch mal Boost an, damit
kann man schon viel machen.
cppuser schrieb:> Gibt es sowas wie eine großes libverzeichnis für c++, was diese Probleme> irgendwie löst?http://www.boost.org/> In c# kann ich aus dem Stehgreif die beiden von mir oben genannten> Projekte quasi in Sekundenschnelle schreiben, in c++ theoretisch auch,> aber ich suche unendlich lange nach irgendwelchen Abhängigkeiten und> libs, so arbeitet doch keiner?
Curl wird meistens unter Linux/UNIX genutzt. Dort gibt es für so etwas
einen Paketmanager, der sich um die Abhängigkeiten kümmert.
Dumdi D. schrieb:> Das grundsaetzliche Problem mit c++ ist, dass das ABI nichst> stabil/spezifiziert ist.
Und wozu existiert dann z.B. das Itanium ABI?
Dumdi D. schrieb:> D.h. nur libs die mit demselben Compiler und derselben version.erstellt> wurden koenneb gelinkt werden
Stimmt nur begrenzt, die meisten Compiler sind zu sich selbst
abwärtskompatibel; tatsächliche Brüche im ABI sind gut dokumentiert. Für
die Interoperabilität zwischen verschiedenen Compiler lässt sich auch
oft sorgen z.B. über spezielle Optionen.
> Curl wird meistens unter Linux/UNIX genutzt. Dort gibt es für so etwas> einen Paketmanager, der sich um die Abhängigkeiten kümmert.
Was nutzt ihr als Alternative für Windows?
> http://www.boost.org/>
top, das schau ich mir mal an.
> Das grundsaetzliche Problem mit c++ ist, dass das ABI nichst> stabil/spezifiziert ist. D.h. nur libs die mit demselben Compiler und> derselben version.erstellt wurden koenneb gelinkt werden> Deswegen.wird sooft ein C Interface.verwendet.
Suchst du denn dann jedes Mal nach der richtigen Libversion bei dr
Google oder gibt es da unter Windows eine IDE, die einem die Arbeit
abnimmt?
Dr. Sommer schrieb:> Und wozu existiert dann z.B. das Itanium ABI?
Naja, das.ist dann halt eines von mehreren abis. Welche compiler
unterstuetzen diese abi?
Dr. Sommer schrieb:> Stimmt nur begrenzt, die meisten Compiler sind zu sich selbst> abwärtskompatibel; tatsächliche Brüche im ABI sind gut dokumentiert. Für> die Interoperabilität zwischen verschiedenen Compiler lässt sich auch> oft sorgen z.B. über spezielle Optionen.
Welche optionen.sind das fuer.msvc?
cppuser schrieb:>> Gibt es sowas wie eine großes libverzeichnis für c++, was diese Probleme> irgendwie löst?
Naja, M$-Windows ist für SW-Entwicklung irgendwie schon falsch ...
> In c# kann ich aus dem Stehgreif die beiden von mir oben genannten> Projekte quasi in Sekundenschnelle schreiben, in c++ theoretisch auch,> aber ich suche unendlich lange nach irgendwelchen Abhängigkeiten und> libs, so arbeitet doch keiner?
Richtig.
Nimm irgendeine Linux-Distribution (Empfehlung für Entwicklung: Arch
Linux) und lass das den Paket-Manager machen.
Ansonsten schau Dich erst mal hier um:
http://en.cppreference.com/w/cpp/links/libs
Dumdi D. schrieb:> Naja, das.ist dann halt eines von mehreren abis.
Ja. Man muss sich eins auswählen.
Dumdi D. schrieb:> Welche compiler> unterstuetzen diese abi?
"it is used as the standard C++ ABI for many major operating systems on
all major architectures, and is implemented in many major C++ compilers,
including GCC and Clang."
Dumdi D. schrieb:> Welche optionen.sind das fuer.msvc?
z.B. __cdecl und __stdcall .
Nimm Boost und schau Dir im wesentlichen Boost ASIO an. Ein Code
Beispiel für einen einfachen Asynchronen/Synchronen TCP Proxy kann ich
Dir geben.
Grüsse,
René
Dr. Sommer schrieb:> Ändert die Calling-Convention einer Funktion. Beeinflusst also das ABI.
Ja, aber nichr die abwaertskompatibikitaet der versionen, oder
Dumdi D. schrieb:> Ja, aber nichr die abwaertskompatibikitaet der versionen, oder
Weiß nicht. Bei MSVC ist das eh alles etwas komisch. Ich arbeite damit
eher selten. Im Open-Source-Bereich gibt's viele C++ Libraries die ohne
Weiteres direkt genutzt werden können (GTKmm, Boost, ...) - die
Kompatibilitäts-Situation ist also nicht so schlimm.
Dr. Sommer schrieb:> cppuser schrieb:>> Gibt es sowas wie eine großes libverzeichnis für c++, was diese Probleme>> irgendwie löst?>> Unter Linux liefert der Paket Manager nahezu alle Open Source Libraries> frei Haus.
und mit pkg-config auch ein gutes Tool, um gleich alle für die
Installation passenden Compiler- und Linker-Einstellungen zu bekommen.
Dr. Sommer schrieb:> Dumdi D. schrieb:>> D.h. nur libs die mit demselben Compiler und derselben version.erstellt>> wurden koenneb gelinkt werden>> Stimmt nur begrenzt, die meisten Compiler sind zu sich selbst> abwärtskompatibel; tatsächliche Brüche im ABI sind gut dokumentiert.
Es gibt allerdings nicht nur das ABI. Gerade heute habe ich eine C++-Lib
nach einem Upgrade des Compilers nicht mehr weiter nutzen können, weil
sich in der Standardlib was geändert hat, wodurch std::string nicht mehr
binärkompatibel war. Da bringt's einem dann leider nichts, dass das ABI
sich nicht geändert hat.
Rolf M. schrieb:> weil> sich in der Standardlib was geändert hat, wodurch std::string nicht mehr> binärkompatibel war.
Vermutlich SSO oder so. Solche Optimierungen machen C++ zwar sehr
effizient, bewirken aber das Problem mit der Binärkompatibilität. Das
ist eine grundlegende Designentscheidung; wenn man ein Problem damit
hat, kann man z.B. zu Java wechseln, das hat genau diese Probleme nicht.
Würde jemand verlangen, C++ solle das Problem lösen, würde Java
herauskommen :)
Dumdi D. schrieb:> Das grundsaetzliche Problem mit c++ ist, dass das ABI nichst> stabil/spezifiziert ist. D.h. nur libs die mit demselben Compiler und> derselben version.erstellt wurden koenneb gelinkt werden> Deswegen.wird sooft ein C Interface.verwendet.
Erzähl.doch.keinen.Scheiß.
cppuser schrieb:>> Curl wird meistens unter Linux/UNIX genutzt. Dort gibt es für so etwas>> einen Paketmanager, der sich um die Abhängigkeiten kümmert.>> Was nutzt ihr als Alternative für Windows?
Kubuntu auf dem Desktop, Debian und Ubuntu LTS auf dem Server.
Dumdi D. schrieb:> Sheeva P. schrieb:>> Erzähl.doch.keinen.Scheiß.>> ?? Belege doch bitte.die.Gegenmeinung.
Na du bist lustig. Zuerst stellst du eine unbelegte Behauptung auf, und
wenn jemand dir widerspricht, erwartest du einen Beleg.
Rolf M. schrieb:> Zuerst stellst du eine unbelegte Behauptung auf, und wenn jemand dir> widerspricht, erwartest du einen Beleg.
Ich hatte eigebtlich gedacht, das meine Aussage zum Allgemeinwissen von
jedem gehoert, der professionell C++ unter Windows entwickelt. Hier eine
Referenz:
https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017
Immerhin hat man das Problem nicht von 2015 auf 2017 .
Dumdi D. schrieb:> der professionell C++ unter Windows entwickelt
Daran sehen wir wieder wie "professionell" Windows wirklich ist ;-) Wenn
Open Source Compiler das besser hinbekommen...
Dumdi D. schrieb:> Ist es so viel.besser?
Da nicht jede einzelne Version inkompatibel ist, ja. Die Änderung an
std::string ist C++ selbst Schuld, nicht GCC/libstdc++.
Dr. Sommer schrieb:> Da nicht jede einzelne Version inkompatibel ist, ja. Die Änderung an> std::string ist C++ selbst Schuld, nicht GCC/libstdc++.
Da stimme ich auch zu.
Dumdi D. schrieb:> Rolf M. schrieb:>> Zuerst stellst du eine unbelegte Behauptung auf, und wenn jemand dir>> widerspricht, erwartest du einen Beleg.> Ich hatte eigebtlich gedacht, das meine Aussage zum Allgemeinwissen von> jedem gehoert, der professionell C++ unter Windows entwickelt.
Tue ich nicht. Ich entwickle (sowohl geschäftlich, als auch privat)
unter Linux. Deshalb weiß ich nicht, wie gut oder schlecht Windows das
hinbekommt.
Es ist auch klar, dass das in C alles wesentlich einfacher ist (wobei
ich dort auch schon Inkompatibilitäten durch unterschiedliche
libc-Versionen hatte). Aber dass es zwischen verschiedenen
Compiler-Version nie kompatibel ist, stimmt eben auch nicht. Dass es
nicht passt, ist zumindest unter Linux eher die Ausnahme als die Regel.
Dumdi D. schrieb:> Dr. Sommer schrieb:>> Wenn Open Source Compiler das besser hinbekommen...>> Ist es so viel.besser?>> https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
Da hätt ich vielleicht mal reinschauen sollen. Das klingt genau nach dem
Problem, dass ich hatte, und es gibt eine Lösung. Jetzt ist mir auch
klar, warum ein -std=c++98 nicht geholfen hat.
Aber was ich mich frage: Ist das wirklich ein Unterschied im ABI und
nicht eher einer in der API, wenn ein std::string nicht ein
std::basic_string<...> ist, sondern ein std::__cxx11::basic_string<...>?
Dumdi D. schrieb:> Ich hatte eigebtlich gedacht, das meine Aussage zum Allgemeinwissen von> jedem gehoert, der professionell C++ unter Windows entwickelt.
Da habe ich einmal mehr Glück gehabt, daß ich weder unter noch für
Windows entwickeln muß.
> Hier eine Referenz:>> https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017>> Immerhin hat man das Problem nicht von 2015 auf 2017 .
Das ist ein Problem der betroffenen Compiler, keines von C++.
Sheeva P. schrieb:> Das ist ein Problem der betroffenen Compiler, keines von C++.
Wenn man vom ABI spricht, kann man das meiner Meinung nach nicht so
trennen.
Weil man bei Java keine Inkompatibilitäten schaffen wollte, ist das
Generics System so beschränkt. Die C++ Templates sind um Größenordnungen
mächtiger, bewirken aber derartige Probleme. Man kann sich dann das
passende Übel aussuchen...
Mit Boost solltest du schon recht weit kommen, Boost ist aus Erfahrung
sehr gut und auch schnell, wenn du GUI willst irgendwas Richtung Qt.
Wenn du etwas rechnen willst entweder die entsprechenden Datentypen aus
Boost verwenden oder wenn es noch genauer sein soll dann die gmplib.
OpenMP und OpenCL darf man natürlich nicht vergessen zu erwähnen.
Und ich würde standardmäßig gegen libstdcc++ im parallel Mode linken.
Das sind ein paar Flags und man kann damit eigentlich kaum etwas falsch
machen, gewinnt teils aber enorm an Performance.
http://ls11-www.cs.tu-dortmund.de/people/gutweng/AD08/VO11_parallel_mode_overview.pdf