C-DLL из источника C ++ - PullRequest
       19

C-DLL из источника C ++

1 голос
/ 26 октября 2009

У меня есть C-Wrapper для моей C ++ Framework. Так как это должно работать на Mac и Windows, я использую scons :

env = Environment()
env.Append(CPPPATH = ['./'])
env.Append(LIBS = 'kernel32.lib')
env.Append(LIBPATH = 'C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib')

env.SharedLibrary(target='warpLib', source='warplib.cpp')

Простые версии warplib.cpp и warplib.h выглядят так:

warplib.cpp

#define DllExport __declspec( dllexport )
#include "warplib.h"

extern "C" {
  DllExport int foo(int a) {
    return a;
  }
}

warplib.h

#define DllExport __declspec( dllexport )

extern "C" {
  DllExport int foo(int a);
}

Кто-нибудь может мне сказать, что с этим не так? Я перепробовал почти все возможные комбинации «extern« C »», но всегда выдает что-то вроде «ошибка C2732: спецификация связи противоречит более ранней спецификации для« ... »».

Если я пропущу 'extern "C"', это сработает, но я не вижу .lib-файла, и я почти уверен, что мне это нужно для реального использования библиотеки.

1 Ответ

0 голосов
/ 26 октября 2009

Вам нужно только extern "C" в декларации. Любой, кто включит этот заголовок, будет ожидать ссылки на него, используя стандарт связывания C, а не оформленную форму C ++. Исходный файл warplib.cpp и последующий объектный файл будут правильно отображать функцию foo, если включено warplib.h.

При использовании MSVC имеется множество полуполезных сценариев и предусмотрены сочетания клавиш для "среды сборки" с большим количеством переменных среды и путей, связанных с dev. Я рекомендую найти подходящий скрипт для выполнения, чтобы вставить эти переменные в вашу среду, или запустить консоль разработчика.

...