création d'une dll incluant une classe c++ avec mingw32
Bonjour à tous,
Alors voilà, j'ai un problème qui m'agasse depuis un petit bout de temps...
J'ai du code c++ que je veux faire tourner sous linux, mac et win... je ne veux pas donner mon code, donc, je crée des librairies. Sous linux pas de problème, mais pour créer des dll qui fonctionnent correctement c'est la galère !
voilà un exemple bidon de classe :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
//--------------------------------------------------------------------
// Fichier .h
#ifndef __TEST_TOOL_H__
#define __TEST_TOOL_H__
#include "StdAfx.h" // Modifié pour passer aussi sous linux
#ifdef TEST_TOOL_DLL_EXPORTS
#define TEST_TOOL_API __declspec(dllexport)
#else
#define TEST_TOOL_API __declspec(dllimport)
#pragma message("**** Importation de la DLL (2) ****")
#endif
#include <stdio.h>
#include <stdlib.h>
class TEST_TOOL_API CTest
{
public:
CTest();
~CTest();
void Somme();
public:
int a;
int b;
int c;
};
#endif |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
//--------------------------------------------------------------------
// Fichier de la dll .cpp
#include "TestLib.h"
CTest::CTest()
{
a = 2;
b = 6;
c = 0;
}
CTest::~CTest()
{
}
void CTest::Somme()
{
c = a + b;
printf("\n **** %d + %d = %d ****\n",a,b,c);
} |
Code:
1 2 3 4 5 6 7 8 9 10
|
# Makefile de la dll (exécuté sur mingw32)
...
library: obj
$(MKDIR) $(LIB_DIR_LIB)
ar rc $(LIB_DIR_LIB)/lib$(LIB_TEST_NAME).a $(LIB_DIR_SRC)/$(LIB_TEST_NAME).o
ranlib $(LIB_DIR_LIB)/lib$(LIB_TEST_NAME).a
g++ -shared -o $(LIB_DIR_LIB)/$(LIB_TEST_NAME).dll $(LIB_DIR_SRC)/$(LIB_TEST_NAME).o -Wl,--kill-at,--output-def,$(LIB_DIR_SRC)/$(LIB_TEST_NAME).def
dllwrap --def $(LIB_DIR_SRC)/$(LIB_TEST_NAME).def -o $(LIB_DIR_LIB)/$(LIB_TEST_NAME).dll $(LIB_DIR_SRC)/$(LIB_TEST_NAME).o
... |
Fichier .def généré par le makefile :
EXPORTS
_ZN5CTest5SommeEv @1
_ZN5CTestC1Ev @2
_ZN5CTestC2Ev @3
_ZN5CTestD1Ev @4
_ZN5CTestD2Ev @5
Code:
1 2 3 4 5 6 7 8 9 10 11
|
//--------------------------------------------------------------------
// Fichier principal
#include "TestLib.h"
int main(int argc, char* argv[])
{
CTest *_Test = new CTest();
_Test->Somme();
return 0;
} |
Message d'erreur de visual c++ :
--------------------Configuration: test3 - Win32 Debug--------------------
Linking...
Creating library Debug/test3.lib and object Debug/test3.exp
test3.obj : error LNK2001: unresolved external symbol "public: void __thiscall CTest::Somme(void)" (?Somme@CTest@@QAEXXZ)
test3.obj : error LNK2001: unresolved external symbol "public: __thiscall CTest::CTest(void)" (??0CTest@@QAE@XZ)
Debug/test3.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
test3.exe - 3 error(s), 0 warning(s)
Je souhaite donc compiler ma dll sous mingw32 et l'intégrer dans visual c++.
Je suis un peu perdu là... j'ai essayé un nombre considérable de solutions et rien ne passe. Par contre si la dll est crée sous visual, tout se déroule sans problème. De même une dll en C (en utilisant extern "C") fonctionne correctement.
Je pense que c'est un problème de nom de fonction (voir .def). Car la compilation se passe bien, mais pas lédisiotn de liens.
qqun peut-il m'éclairer ?
merci
Re: création d'une dll incluant une classe c++ avec mingw32
Citation:
Envoyé par TheShadow
Je souhaite donc compiler ma dll sous mingw32 et l'intégrer dans visual c++.
IIRC, ce n'est pas possible. ABI différentes. Ou alors GCC a fait des progrès.
Tu risques de devoir livrer autant de bibliothèques précompilées que de compilos cibles.