Statisches libcurl zur Code::Blocks IDE hinzugefügt

Lesezeit: 6 Minuten

Statisches libcurl zur CodeBlocks IDE hinzugefugt
Javatar

Ich kann nicht herausfinden, wie ich meiner Code::Blocks-IDE eine statische libcurl-Bibliothek hinzufügen kann. Ich möchte es statisch, weil dann zur Laufzeit meines Programms keine .dll-Dateien benötigt werden, die nicht standardmäßig in Windows enthalten sind. Ich verwende diese libcurl:
http://curl.haxx.se/dlwiz/?type=lib&os=Win32&flav=- (minGW ohne OpenSSL)

Hier sind meine globalen Compiler-Einstellungen: http://img845.imageshack.us/img845/1381/halpr.jpg

Ich erhalte den folgenden Fehler:

ld.exe||kann -lCURL_STATICLIB| nicht finden ||=== Bau abgeschlossen: 1 Fehler, 0 Warnungen ===|

beim Kompilieren dieses Codes:

include <stdio.h>
include <curl/curl.h>

int main(void)
{
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
res = curl_easy_perform(curl);

/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}

Offensichtlich findet es CURL_STATICLIB nicht, aber ich habe keine Ahnung warum. Ich bin mir nicht einmal sicher, ob es notwendig war, CURL_STATICLIB zu meinen Linker-Einstellungen hinzuzufügen (ich habe es in anderen Foren gelesen). Ich habe einige Leute gefunden, die das gleiche Problem haben, aber es wird an keiner Stelle richtig beantwortet:

stackoverflow.com/questions/4176503/frustrated-with-libcurl

forums.codeblocks.org/index.php?topic=11391.0

old.nabble.com/gcc-working-with-libcurl-td20506927.html

forums.devshed.com/c-programming-42/linker-error-using-libcurl-698071.html

Ich bin es so leid, damit zu kämpfen, bitte helft mir.

BEARBEITEN:

Hallo Victor, danke für die Antwort!

Ich werde versuchen, so detailliert wie möglich zu sein, damit es keine Missverständnisse gibt. Hier ist also das Bild des Verzeichnis-/Ordnerbaums für meinen Ordner C:libs:

http://img199.imageshack.us/img199/6977/curl1.png

Wie Sie sehen können, enthält es auch ein Build-Protokoll. Sie werden feststellen, dass der Fehler dieses Mal anders ist als der, den ich zuvor gepostet habe. Das liegt daran, dass ich den globalen Compiler geändert und Projekteinstellungen erstellt habe.

Meine neuen Build-Projekteinstellungen: http://img863.imageshack.us/img863/4404/buildoptions.png
Meine neuen Global Compiler Einstellungen: http://img225.imageshack.us/img225/4926/curl2.png

Ich bin mir sicher, dass ich diese Einstellungen falsch konfiguriert habe und deshalb kann ich es nicht kompilieren.

  • Um ein wenig mehr Informationen zu erhalten, können Sie auch angeben, wie die tatsächlich aufgerufene Befehlszeile aussieht? Sie können dies tun, indem Sie auf die Registerkarte Andere Einstellungen gehen und in der Dropdown-Liste Vollständige Befehlszeile auswählen. Können Sie auch eine Liste der Dateien bereitstellen, die in Ihrem Verzeichnis lib/curl-7.xx*/lib vorhanden sind?

    – Großwolf

    8. Juni 11 um 0:24 Uhr

  • Wie haben Sie die libcurl-Dateien “installiert”? Haben Sie gerade ein neues Verzeichnis erstellt und die lib- und include-Ordner dorthin kopiert und dann Codeblocks angewiesen, dort nachzusehen? Ich versuche das Problem selbst zu lösen. Danke! 🙂

    – llk

    28. Juni 11 um 0:14 Uhr

1642337288 809 Statisches libcurl zur CodeBlocks IDE hinzugefugt
Großwolf

Okay, ich habe es geschafft, Ihr Beispiel erfolgreich mit libcurl mit statischer Verknüpfung zu erstellen. Die Details, die erforderlich sind, damit diese Arbeit funktioniert, sind ziemlich kompliziert – die korrekte Einrichtung kann für Unvorsichtige schwierig werden.

Hier sind die Schritte, die ich verwendet habe, um diese Arbeit zu machen, achten Sie darauf, sie sorgfältig zu befolgen:

  1. Gehe zu Projekterstellungsoptionen->Compilereinstellungen->#defines: eintippen CURL_STATICLIB. Wenn dies definiert ist, werden die Funktionssignaturen des Headers libcurl.h vorverarbeitet, um sie an die statische Verknüpfung anzupassen. Andernfalls wird von einer dynamischen Verknüpfung ausgegangen und die Namen werden dann entstellt _imp__*. Die nicht behobenen Fehler aus Ihrem Screenshot weisen darauf hin, dass versucht wird, einen dynamischen Link anstelle des gewünschten statischen Links zu verwenden.
    1642337288 611 Statisches libcurl zur CodeBlocks IDE hinzugefugt

  2. Unter Projekterstellungsoptionen->Linker-Einstellungen->Bibliotheken verknüpfen Stellen Sie sicher, dass es Folgendes enthält: curl, rtmp, idn, ssl, ssh2, crypto, z, ws2_32, wldap32, winmm, gdi32. Beachten Sie, dass die Reihenfolge wichtig ist. Aufgrund eines Designmangels des Gnu-Linkers müssen die abhängigsten Bibliotheken zuerst aufgelistet werden, gefolgt von den am wenigsten abhängigen. Andere Linker wie msvc link und ilinker von borland weisen solche Probleme nicht auf – die Bibliotheken können in beliebiger Reihenfolge aufgelistet werden.

  3. Unter Projekterstellungsoptionen->Linker-Einstellungen->Andere Linker-Optionen fügen Sie ‘-static’ hinzu. Dadurch wird sichergestellt, dass die statische Version von „idn“ verwendet wird. Wenn dieser Schalter weggelassen wird, hängt Ihr kompiliertes Programm möglicherweise davon ab, dass ‘libidn-11.dll’ ausgeführt wird, was wahrscheinlich nicht das ist, was Sie wollen.
    1642337288 75 Statisches libcurl zur CodeBlocks IDE hinzugefugt

An diesem Punkt sollten Sie in der Lage sein, libcurl-Programme ohne Probleme zu kompilieren und zu linken. Ein paar erwähnenswerte Dinge,

  • Unter Andere Linker-Optionen Die anderen zusätzlichen Schalter aus Ihrem Screenshot werden nicht benötigt. ‘libcurl.a’ ist bereits aufgelistet und abgedeckt durch Bibliotheken verknüpfen.

  • Die ‘libcrypto.a’ scheint die gleichen Referenzen abzudecken wie die ‘libeay32.a’, also wird nur eine davon benötigt. ‘libeay32.a’ verursacht jedoch trotz seiner größeren Größe eine dynamische Verknüpfung. Wenn Sie möchten, dass Ihre Anwendung „vollständig eigenständig“ ist, verwenden Sie stattdessen „libcrypto.a“ wie im Screenshot.

  • Wenn Sie in Zukunft dynamisch verlinken möchten, ersetzen Sie einfach die Auflistung durch „curldll“ darunter Bibliotheken verknüpfen und entfernen Sie die CURL_STATICLIB definieren. Die zusätzlichen Bibliotheken (z. B. ssl, idn, rtmp usw.) werden nicht benötigt, da libcurl.dll sie bereits abdeckt.

  • Sie können die langwierige und fehleranfällige Einrichtung eines neuen libcurl-Programms vermeiden, indem Sie die Benutzervorlagen von Codeblocks verwenden. (z.B. Datei->Neu->Projekt->Benutzervorlagen)

Hoffentlich löst dies alle Build-Probleme, die Sie mit libcurl haben, ein für alle Mal.

  • Danke für die ausführliche Beschreibung und Tipps! Es hat für mich funktioniert, es jetzt statisch und dynamisch zu bauen! Nur noch eine letzte Frage: Woher wussten Sie, was wo hinzugefügt werden muss? Aus welcher Quelle hast du die Informationen entnommen? Ich würde das auch gerne lernen, damit ich nicht jedes Mal Stackoverflow spammen muss, wenn ich meiner IDE eine neue Bibliothek hinzufügen möchte. Nochmals vielen Dank! 🙂

    – Javatar

    9. Juni 11 um 12:15 Uhr


  • @newbie Die Links aus Ihrer Frage boten einen guten Ausgangspunkt, aber vieles stammte aus der Erfahrung mit den Tools und Trial-and-Error. Mingw wird mit ‘nm’ und ‘objdump’ geliefert, was sehr hilfreich war – sie ermöglichen es Ihnen, genau zu überprüfen, was in der betreffenden Bibliotheksdatei enthalten ist (andere Compiler haben ihre eigene Version von ‘objdump’). Kombinieren Sie dies mit ‘grep’ (‘findstr’ unter Windows funktioniert auch) und Sie können feststellen, wo sich eine bestimmte Funktion oder ein Datenelement befindet (oder ob es überhaupt existiert). Auch die Untersuchung von libcurl.h lieferte nützliche Hinweise. Und natürlich das gute alte MSDN.

    – Großwolf

    9. Juni 11 um 21:42 Uhr


  • Die rtmp-Bibliothek ist aus rechtlichen Gründen (DMCA) irrelevant, lange Rede kurzer Sinn, es ist möglich, libcurl statisch zu verknüpfen, sie verarbeitet nur keine rtmp://-URLs. Ich selbst brauchte weder das noch die idn-Bibliothek, also habe ich beide entfernt und es hat funktioniert. Großes Lob an die Leute, die diese Bibliotheken hinter Cygwin hacken, und an Sie für die Bereitstellung einer detaillierten Erklärung, wie das geht.

    – Holdsworth

    2. Juni 17 um 23:42 Uhr

.

505600cookie-checkStatisches libcurl zur Code::Blocks IDE hinzugefügt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy