Dll Fehler
-
Hoi, ich will grad kurz ne kleine Dll schreiben und kriege da dauernd nicht aufgelöste externe, obwohl das eigentlich nicht sein sollte, ein kleines minimal snippet:
main.h:
#ifdef MAIN_EXPORTS #define MAIN_API __declspec(dllexport) #else #define MAIN_API __declspec(dllimport) #endif #include <iostream> namespace CurlDll { class CallHost { public: static MAIN_API std::string callUrl(std::string pUrl, std::string pProxy); static MAIN_API void Try(); }; }
main.cpp
#include "main.h" #include <Windows.h> #include <curl/curl.h> namespace CurlDll { std::string CallHost::callUrl(std::string pUrl, std::string pProxy) { CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); res = curl_easy_perform(curl); if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); } return "test"; } void CallHost::Try() { MessageBox(0,"lololowwwwwwwwwwwl", "wqgqwwwwwgq", MB_OK |MB_ICONINFORMATION); } }
Spätestens beim curl Kram rastet der compiler komplett aus und wirft 52 unaufgelöste externe, aber wenn man den Curl Kram weglässt und nur die Try Methode anwendet kommt auch:
Fehler 4 error LNK1120: 1 nicht aufgelöste Externe
Fehler 3 error LNK2001: Nicht aufgelöstes externes Symbol "__imp__MessageBoxA@16".Sry aber ich steh grad etwas aufm Schlauch, ist auch ehrlich gesagt das erste mal, dass ich eine Dll mache, die einfach nur ein paar Funktionen bereitstellen soll.
-
Du musst dem Linker sagen dass er gegen die "User32.lib" linken soll.
-
Ah war wohl ein Problem mit der einen Solution, in der neuen gings, user32 sollte ja auch standardmäßig drin sein^^
Aber hast du vil. noch ne Idee warum der Libcurl Kram auch linker error´s throwt? Die verlinkung in eingabe und include ist definitiv richtig und funktioniert in nem executable Projekt wunderbar. Ist auch static gelinkt
-
Schön, dass du die Namen der fehlenden Funktionen verschweigst! Da können wir endlich mal wieder raten.
Binde die fehlende Bibliothek dazu. 32 und 64 Bit lassen sich nicht mischen!
-
Sry^^
Projekt ist 32 bit, die Lib´s auch, wie gesagt, funktioniert mit den gleichen includes und links in nem anderen executable Projekt ganz wunderbar.
mein Code atm:
main.h
#ifdef MAIN_EXPORTS #define MAIN_API __declspec(dllexport) #else #define MAIN_API __declspec(dllimport) #endif #include <iostream> namespace CurlDll { class CallHost { public: static MAIN_API void Try(); }; }
#include "main.h" #include <Windows.h> #include <curlpp/cURLpp.hpp> #include <curlpp/Easy.hpp> #include <curlpp/Info.hpp> #include <curlpp/Options.hpp> #include <curlpp/Exception.hpp> namespace CurlDll { void CallHost::Try() { curlpp::Easy request; request.setOpt(new curlpp::options::UserAgent("Mozilla/4.0")); request.setOpt(new curlpp::options::AutoReferer(true)); request.setOpt(new curlpp::options::FollowLocation(true)); request.setOpt(new curlpp::options::Url("http://xml.utrace.de")); request.perform(); MessageBox(0,"lololowwwwwwwwwwwl", "wqgqwwwwwgq", MB_OK |MB_ICONINFORMATION); } } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason) {return 1;}
Ich kriege 47 Fehler mit 26 nicht aufgelösten externen (ohne den Curl Kram klappts jetzt also liegt definitiv daran)
Fehler 2 error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAStartup@8".
Fehler 11 error LNK2001: Nicht aufgelöstes externes Symbol "__imp__WSAGetLastError@0".
Fehler 33 error LNK2001: Nicht aufgelöstes externes Symbol "__imp__setsockopt@20".
usw. und so fort, brauch ich jetzt glaub ich nicht alle rauskopieren^^
-
Und hast du mal versucht herauszufinden, was das für Funktionen sind?
-
Alle funktionen der libcurl library
Wie gesagt, wenn ich ne statische Library oder ne .exe compile gehts wunderbar, also muss es offenbar daran liegen, dass man bei einer dll noch etwas extra machen muss o.ä. ?
-
Etix schrieb:
Alle funktionen der libcurl library
Nein, keine der drei.
-
Tipp: WSA steht für "Windows Sockets API"
-
Etix schrieb:
Wie gesagt, wenn ich ne statische Library oder ne .exe compile gehts wunderbar, also muss es offenbar daran liegen, dass man bei einer dll noch etwas extra machen muss o.ä. ?
Naja in eine Anwendung werden wohl standardmäßig ein paar mehr libs gelinkt. Normal brauchst du aber "Ws2_32.lib" auch noch.