Вопрос

У меня есть 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 предоставляется множество полуполезных скриптов и ярлыков консоли "среда сборки", а также множество переменных среды и путей, связанных с разработчиками.Я рекомендую найти подходящий скрипт для вставки этих переменных в вашу среду или запустить консоль разработки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top