Использование CurlPP с vs2008
Я пытаюсь создать консольное приложение С++ в 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;
}
Я загрузил источник и указал, что мой путь include указывает на исходные файлы include, но когда я пытаюсь скомпилировать, я получаю лодку ошибок в встроенных файлах типа:
определение функции dllimport не разрешено
Конечно, многие люди использовали curlpp с vs2008, и мне не хватает чего-то очевидного.
Ответы
Ответ 1
Взгляните на файл \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
Ответ 2
Обычно люди получают эту ошибку, когда пытаются # включить заголовочный файл библиотеки с определенным макросом библиотеки EXPORT. curlpp должен иметь макрос, обычно находящийся в коде, который выглядит следующим образом:
#ifdef NATIVEDLL_EXPORTS
#define NATIVEDLL_API extern "C" __declspec(dllexport)
#else
#define NATIVEDLL_API __declspec(dllimport)
#endif
и у вас есть NATIVEDLL_EXPORTS, определенные в препроцессоре. Удалите это определение. ppcurl не будет называться "NATIVEDLL_EXPORTS", у него будет свое собственное имя.
Ответ 3
Дополнение к ответу Петра: не забудьте самостоятельно создать libcurl - динамически или статически и определить CURL_STATICLIB вместе с CURLPP_STATICLIB (если, конечно, строить статическую версию).
И на стороне: мне абсолютно не понравилась CURLPP, было трудно понять, как заставить ее делать то, что мне нужно. Вы можете использовать чистый libcurl со своей собственной оболочкой.