C-DLL из исходного кода C ++
Вопрос
У меня есть C-оболочка для моего фреймворка C ++.Поскольку это должно работать на Mac и Windows, я использую лепешки:
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, и я почти уверен, что мне это нужно, чтобы действительно использовать библиотеку.
Решение
Вам должно понадобиться только extern "C"
о заявлении.Любой, кто затем включит этот заголовок, будет ожидать, что будет ссылаться на него, используя стандарт связывания C, а не оформленную форму C ++.Тот самый warplib.cpp
исходный файл и последующий объектный файл предоставят доступ к функции foo
правильно, если warplib.h
входит в комплект поставки.
При использовании MSVC предоставляется множество полуполезных скриптов и ярлыков консоли "среда сборки", а также множество переменных среды и путей, связанных с разработчиками.Я рекомендую найти подходящий скрипт для вставки этих переменных в вашу среду или запустить консоль разработки.