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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top