Функции, не возвращающие правильное значение в DLL - PullRequest
3 голосов
/ 21 марта 2012

Это так расстраивает! Я не знаю, почему это происходит. У меня есть файл с именем weirdDLL.c :

double five() {
    return 5.0;
}

У меня есть другой файл с именем 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;
}

Я ожидаю, что при компиляции и связывании с DLL код в weirdTest завершится без ошибок. Я компилирую на 64-битной Windows 7 , используя gcc (cygwin) с командами:

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

Вывод:

Test failed with 0.000000

Кажется, что DLL подключается правильно, потому что компилятор не жалуется на отсутствие функции "пять". Кроме того, когда я помещаю операторы печати в код DLL, они отображаются нормально. Что я сделал не так?

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

Просто дикая догадка:

Кажется, вы не объявляете прототип Five () в weirdTest.c, поэтому компилятор обрабатывает возвращаемый тип этой функции как int.Результирующее преобразование из int в double портит ваше первоначальное значение double.

0 голосов
/ 21 марта 2012

используйте dumpbin (windwos) или nm (linux), чтобы вывести свою функцию экспорта из DLL

и посмотрите, экспортируется ли пять () или нет

...