Использование CurlPP с vs2008
Я пытаюсь создать консольное приложение C++ в VS2008, используя статическую библиотеку curlpp. Код, который является примером curlpp 00, выглядит следующим образом:
#include "stdafx.h"
#include <curlpp/curlpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
using namespace curlpp::options;
int main(int, char **)
{
try
{
// Our request to be sent.
curlpp::Easy myRequest;
// Set the URL.
myRequest.setOpt<Url>("http://example.com");
// Send request and get a result.
// By default the result goes to standard output.
myRequest.perform();
}
catch(curlpp::RuntimeError & e)
{
std::cout << e.what() << std::endl;
}
catch(curlpp::LogicError & e)
{
std::cout << e.what() << std::endl;
}
return 0;
}
Я скачал исходный код, и мой путь включения указывал на исходные файлы включения, но когда я пытаюсь скомпилировать, я получаю кучу ошибок во встроенных файлах типа:
определение функции dllimport не допускается
Конечно, многие люди использовали curlpp с vs2008, и я упускаю что-то очевидное.
3 ответа
Взгляните на файл \include\curlpp\internal\buildconfig.h, в котором определены следующие макросы
CURLPPAPI
CURLPP_INCLUDE_TEMPLATE_DEFINITIONS
CURLPP_TEMPLATE_EXPLICIT_INSTANTIATION
основанный на значениях этих трех макросов
CURLPP_STATICLIB
BUILDING_CURLPP
CURLPP_SELF_CONTAINED
Прочитайте о них в файле README.win32 и определите выше три макроса соответственно.
Если у вас все еще есть проблема, сообщите нам.
Кстати; сегодня ставлю текущую версию curlpp для скачивания curlpp-current.2009.05.21
Обычно люди получают эту ошибку, когда пытаются #include заголовочный файл библиотеки с определенным макросом библиотеки "EXPORT". curlpp должен иметь некоторый макрос, обычно встречающийся в коде, который выглядит следующим образом:
#ifdef NATIVEDLL_EXPORTS
#define NATIVEDLL_API extern "C" __declspec(dllexport)
#else
#define NATIVEDLL_API __declspec(dllimport)
#endif
и у вас есть NATIVEDLL_EXPORTS, определенный в препроцессоре. Удалить это определение. ppcurl не будет называться "NATIVEDLL_EXPORTS", у него будет собственное имя.
Дополнение к ответу Пиотра: не забудьте соответственно построить сам libcurl - динамически или статически и определить CURL_STATICLIB вместе с CURLPP_STATICLIB (если, конечно, создается статическая версия). И на заметку: мне абсолютно не нравился CURLPP, было трудно понять, как заставить его делать то, что мне нужно. Возможно, вы захотите использовать чистый libcurl со своей собственной оболочкой.