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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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