Как использовать libssh в проекте Borland Cbuilder?

Некоторое время назад я использовал libssh в проекте Visual Studio. Все идет нормально.

Теперь я хочу использовать эту библиотеку в другом проекте, проекте Borland Cbuilder. Но теперь я получаю много ошибок компилятора.

Я начал с того, что поместил в заголовок следующее:

#include <libssh/libssh.h>
#include <libssh/sftp.h>

Но это дает следующую ошибку:

[C++ Error] libssh.h(59): E2209 Unable to open include file 'unistd.h'

Это относится к файлу unix, так что это нехорошо. В файле libssh.h я вижу следующий код:

#ifdef _MSC_VER
  /* Visual Studio hasn't inttypes.h so it doesn't know uint32_t */
  typedef int int32_t;
  typedef unsigned int uint32_t;
  typedef unsigned short uint16_t;
  typedef unsigned char uint8_t;
  typedef unsigned long uint64_t;
  typedef int mode_t;
#else /* _MSC_VER */
  #include <unistd.h>
  #include <inttypes.h>
#endif /* _MSC_VER */

Поэтому я попытался включить следующую строку в свой заголовочный файл в качестве обходного пути:

#define _MSC_VER   1

Но затем я получаю другую ошибку:

[C++ Error] types.h(47): E2238 Multiple declaration for 'mode_t'
[C++ Error] libssh.h(57): E2344 Earlier declaration of 'mode_t'

Короче говоря: какие бы следующие обходные пути я ни пробовал, я всегда получаю ошибки компилятора.

Можно ли это исправить? Или libssh можно использовать только с компиляторами Microsoft?

[Редактировать:] Я попробовал еще одну вещь: включить typedefs из заголовка libbssh в мой собственный заголовок. Затем я получаю следующую ошибку:

[C++ Error] sftp.h(50): E2238 Multiple declaration for 'uid_t'

для следующего фрагмента из sftp.h:

#ifndef uid_t
  typedef uint32_t uid_t;
#endif /* uid_t */

Я ошеломлен....

Кстати, я использую Borland C++builder 5.0. (Я знаю, что это древнее)


person Hneel    schedule 15.11.2017    source источник


Ответы (1)


Ну, в итоге я исправил заголовочные файлы следующим образом:

#ifdef _MSC_VER
  // Do MSVC specific stuff
#else
#ifdef __BCPLUSPLUS__
  // Do Borland specific stuff
#else /* __BCPLUSPLUS__ */
  // Do unix stuff
#endif /* __BCPLUSPLUS__ */
#endif /* _MSC_VER */

Я скопировал материал MSVC в раздел Borland и после некоторой настройки скомпилировал.

person Hneel    schedule 15.11.2017
comment
Используйте __BORLANDC__ вместо __BCPLUSPLUS__ и #elif defined(...) вместо #else #ifdef. Но если разделы VC++ и Borland используют один и тот же код, объедините их вместе, используя #if defined(_MSC_VER) || defined(__BORLANDC__) вместо отдельных #ifdef. - person Remy Lebeau; 16.11.2017