Fra "Standard C++ bible" af Stevens & Walnum (side 89-90): Languages other than C and C++ can be supported by linkage specifications, in which case their string value are implementation-dependent. The C++ compiler must know how to encode the names for those languages. The other language must support C++ compatible conventions for passing arguments and return values. If you link with assembly language or some other language that employs no name mangling, you usually can use extern "C" as the linkage specification for those languages.
Jeg ved ikke lige hvordan det kan forklares på dansk ?
"Skal der så ikke være . . . ?" <- Ja det skal det.
extern "C" erklæringen på en funktion er en instruks til kompileren om at den skal : 1) Bruge en bestemt (veldefineret) måde til at parse argumenter og returværdier 2) Navnet på funktionen skal ikke "mangles".
Når man bruger en C++ compiler vil alle navne normalt blive mangled - dvs compileren tilføjer information til det symbolske navn for en funtion, dette er nødvendigt i C++ hvor f.eks. :
int Cpp_fct(int x) { return x }
er en anden funktion end : float Cpp_fct(float x) { return x; }
Visual C++ compileren generer f.eks. de manglede navne således: int Cpp_fct(int x) : Cpp_fct@@YAHH@Z
og
float Cpp_fct(float x) : Cpp_fct@@YAMM@Z
Hvis jeg derimod angiver :
extern "C" int Cpp_fct(int x);
Vil compileren generere det symbolske navn Cpp_fct - hvilket kan linkes sammen med kode genereret af f.eks. en ren C compiler.
Nu gik dit oprindelige spørgsmål jo faktisk på hvordan man _laver_ et .dll i C.
Soreno's løsning er jo egentligt C++, derfor er extern "C" nødvendigt, hvis du bruger en C compiler (f.eks. ved at give .c filer til MSDEV CL.exe) er det ikke nødvendigt.
/* Funktionsimplementeringer, f.eks. */ __declspec ( dllexport) int getNumber(void) { return 12345; } __declspec ( dllexport) int getAnswer(void) { return 42; }
Og tilsidst - en genereret makefile du kan køre med NMAKE : (nmake /f makefile.mak)
#makefile.mak # Microsoft Developer Studio Generated NMAKE File, Based on testdll.dsp !IF "$(CFG)" == "" CFG=testdll - Win32 Debug !MESSAGE No configuration specified. Defaulting to testdll - Win32 Debug. !ENDIF
!IF "$(CFG)" != "testdll - Win32 Release" && "$(CFG)" != "testdll - Win32 Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "testdll.mak" CFG="testdll - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "testdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "testdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF
Husk at der også er en reel chance for at navne bliver mangled af C-compileren. Eksporterede stdcall C-funktioner (også med extern "C") bliver eksempelvis mangled i Visual C++.
hsloth <- jeg har gemt din kode i filer efter rækkefølge, du postede dem: (folder: dll\) testdll.c makefile.mak dlltester.c
når jeg kører nmake makefile.mak sår får jeg følgende vrøvl: c:\Documents and Settings\stringbuffer\Desktop\dll\testdll.c(2) : fatal error C1083: C nnot open include file: 'windows.h': No such file or directory NMAKE : fatal error U1077: 'cl.exe' : return code '0x2' Stop.
Men for at kunne oversætte mere end en gang måtte jeg ændre en del i den der makefile....
Men nu er jeg da godt igang :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.