Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C/C++] gcc-dll gebruiken met msvc

Pagina: 1
Acties:

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Ik probeer nu al een tijdje om een dll gemaakt met gcc (mingw) te laten samenwerken met MSVC (2008).

Tot op heden geen succes.
Volgens de mingw.org site is het allemaal erg simpel:
How can an MSVC program call a MinGW DLL, and vice versa?

Assume we have a testdll.h, testdll.c, and testmain.c. In the first case, we will compile testdll.c with MinGW, and let the MSVC-compiled testmain call it. You should use
gcc -shared -o testdll.dll testdll.c \
-Wl,--output-def,testdll.def,--out-implib,libtestdll.a

to produce the DLL and DEF files. MSVC cannot use the MinGW library, but since you have already the DEF file you may easily produce one by the Microsoft LIB tool: lib /machine:i386 /def:testdll.def

Once you have testdll.lib, it is trivial to produce the executable with MSVC:
cl testmain.c testdll.lib
kan niet misgaan zou je denken, maar helaas vindt MSVC dat dit niet grappig is en geeft aan dat hij de functie niet kan resolven.

Ik gebruik de volgende testbestanden:
aapje.h
C++:
1
2
3
4
5
6
7
8
#ifndef __AAPJE_H_
#define __AAPJE_H_

#define EXPORT __declspec(dllexport)

EXPORT int geefMijDrie();

#endif


aapje.cpp
C++:
1
2
3
4
5
#include "aapje.h"

int geefMijDrie() {
    return 3;
}


main.cpp
C++:
1
2
3
4
5
6
7
8
9
#include "aapje.h"
#include <iostream>

int main( int argc, char **argv ) {

    std::cout << geefMijDrie() << std::endl;

    return 0;
}


Dus probeerde ik als volgt:

g++.exe aapje.cpp -o aapje.dll -shared -Wl,--output-def,aapje.def,--out-impli
b,libaapje.a


lib /def:aapje.def


Dit gaat prima, maar zodra ik dan met MSVC wil gaan compileren:

cl main.cpp c:\src\dlltest\aapje.lib /I c:\src\dlltest


krijg ik het volgende te horen:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C
4530: C++ exception handler used, but unwind semantics are not enabled. Specify
/EHsc
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
c:\src\dlltest\aapje.lib
main.obj : error LNK2019: unresolved external symbol "int __cdecl geefMijDrie(vo
id)" (?geefMijDrie@@YAHXZ) referenced in function _main
main.exe : fatal error LNK1120: 1 unresolved externals


maar ook als ik /EHsc op de laatste commandline specificeer blijf ik deze unresolved external symbol error krijgen.

Ik hoop dat een van jullie mij hier verder kan helpen :)

oprecht vertrouwen wordt nooit geschaad


  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 01-11 22:03

leuk_he

1. Controleer de kabel!

voorbeeld test code is C, jouw code is C++ ,c++ gebruikt andere calling convertions. Name mangling

kijk eens naar
code:
1
2
3
extern "C" {
     .....
   }

[ Voor 6% gewijzigd door leuk_he op 02-07-2008 22:26 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat leuk_he zegt klopt als een bus, maar overigens is de key issue hier name mangling en niet calling conventions (hoewel je daar ongetwijfeld ook wel problemen mee gaat krijgen). Daarnaast export je geefMijDrie() nog een keer in je main applicatie, omdat die aapje.h include die op zijn beurt weer geefMijDrie() als __declspec(dllexport) declareert.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
leuk_he schreef op woensdag 02 juli 2008 @ 21:56:
voorbeeld test code is C, jouw code is C++ ,c++ gebruikt andere calling convertions.

kijk eens naar
code:
1
2
3
extern "C" {
     .....
   }
:X omg
en dan te bedenken dat ik hier nog aan gedacht had, ik had nog wel geprobeerd met gcc en aapje.c als input file..

wat ik even vergeten was is dat de main als c++ file gecompileerd werd en de header dus ook als c++ interpreteert..

fail.. iig thanks voor de tip, het werkt nu prima :)
.oisyn schreef op woensdag 02 juli 2008 @ 22:20:
Wat leuk_he zegt klopt als een bus, maar overigens is de key issue hier name mangling en niet calling conventions (hoewel je daar ongetwijfeld ook wel problemen mee gaat krijgen). Daarnaast export je geefMijDrie() nog een keer in je main applicatie, omdat die aapje.h include die op zijn beurt weer geefMijDrie() als __declspec(dllexport) declareert.
Het is dus verstandiger om __declspec(export) in de cpp file te zetten?

[ Voor 32% gewijzigd door Arjan op 02-07-2008 22:26 ]

oprecht vertrouwen wordt nooit geschaad


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
.oisyn schreef op woensdag 02 juli 2008 @ 22:20:
Daarnaast export je geefMijDrie() nog een keer in je main applicatie, omdat die aapje.h include die op zijn beurt weer geefMijDrie() als __declspec(dllexport) declareert.
Lijkt me niet echt mogelijk he, een ongedefineerde functie exporteren. Exporteren is een linker operatie, en die werkt dus niet op het nivo van een enkele Translation Unit. De linker bouwt simpelweg een tabel op van alles wat geexporteerd is, en vult de uiteindelijke adressen in (relatief tov DLL base).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

True, de declaratie bestaat idd niet meer tijdens linktime.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1