Использование 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 со своей собственной оболочкой.