c - Funktioner, der ikke returnerer korrekt værdi i DLL

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er så frustrerende! Jeg ved ikke, hvorfor det sker. Jeg har en fil kaldet weirdDLL.c :


double five() {
    return 5.0;
}


Jeg har en anden fil kaldet weirdTest.c


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    double f = five();
    if (f != 5.0) {
        printf("Test failed with \%f", f);
        return 1;
    }
    return 0;
}


Jeg forventer, at koden i weirdTest vil udgå uden fejl, når den kompileres og forbindes med DLL'en. Jeg samler på 64bit Windows 7 ved hjælp af gcc (cygwin) med kommandoerne:


gcc -c weirdDLL.c
gcc -shared -o weirdDLL.dll weirdDLL.o
gcc -o test weirdtest.c -L./ -l weirdDLL
./test


Udgangen er:


Test failed with 0.000000


Det ser ud som om DLL'en bliver kædet korrekt, fordi kompilatoren ikke klager over manglende funktion 'fem'. Når jeg lægger udskrivningserklæringer i DLL-koden, vises de også fint. Hvad har jeg gjort forkert?

Bedste reference


Bare et vildt gæt:


Du synes ikke at erklære en prototype for fem () i weirdTest.c, hvorfor kompilatoren behandler returtypen af ​​den funktion som int. Den resulterende konvertering fra int til double messes op din oprindelige dobbeltværdi.

Andre referencer 1


Brug dumpbin (windwos) eller nm (linux) til at liste din eksportfunktion fra DLL


og se om fem () eksporteres eller ej