C-DLL a partir de fonte de C ++
Pergunta
Eu tenho um C-Wrapper para o meu C ++ Framework. Uma vez que este deve ser executado em Mac e Windows que estou usando 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')
versões simples de warplib.cpp e warplib.h parecido com este:
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);
}
Alguém pode me dizer o que está errado com isso? Tentei quase todas as combinações possíveis de 'externo 'C'', mas ele sempre me joga algo como "erro C2732: contradiz especificação ligação anteriormente especificação '...'".
Se eu pular 'extern 'C'' ele funciona, mas eu não vejo nenhum arquivo .lib e eu tenho quase certeza necessidade I que, para realmente usar a biblioteca.
Solução
Você só deve precisar extern "C"
na declaração. Qualquer um, em seguida, incluindo o cabeçalho irá esperar para ligação contra ele usando o C que liga padrão, e não da forma C ++ decorados. O arquivo de origem warplib.cpp
, e posterior arquivo objeto irá expor a função foo
corretamente se warplib.h
está incluído.
Ao usar MSVC, há uma infinidade de roteiros semi-úteis, e "ambiente de compilação" atalhos de console fornecidos, com um monte de variáveis ??de ambiente DEV-relacionada e caminhos fornecidos. Eu recomendo encontrar um roteiro adequado para executar para inserir essas variáveis ??em seu ambiente, ou executando o console dev.