【问题标题】:Functions not returning correct value in DLL函数在 DLL 中没有返回正确的值
【发布时间】:2012-04-05 17:52:51
【问题描述】:

这太令人沮丧了!我不知道为什么会这样。我有一个名为 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 链接时,怪异测试中的代码将退出而不会出错。我正在使用 gcc (cygwin) 和命令在 64bit Windows 7 上进行编译:

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 代码中时,它们显示得很好。我做错了什么?

【问题讨论】:

  • stackoverflow.com/questions/9780930/… 你有同样的问题 - 你需要在main() 调用它之前有一个函数five() 的声明/原型,这样编译器就知道它不会返回一个int .
  • @Michael Burr:是的问题,谢谢! DLL 是一条红鲱鱼。但是为什么编译器需要一个 int 呢?函数原型在 DLL 代码中可用,我还将返回值分配给 double。

标签: c windows gcc dll return


【解决方案1】:

只是一个疯狂的猜测:

你似乎没有在奇怪的Test.c 中声明five() 的原型,这就是编译器将该函数的返回类型视为int 的原因。由此产生的从 int 到 double 的转换会弄乱您原来的 double 值。

【讨论】:

  • 你的疯狂猜测似乎是正确的 :) 但@Michael 只是比你快。不过,+1!
  • 不幸的是,迈克尔将他的答案作为评论发布,因此我将其标记为正确。谢谢!
  • 我认为这个故事的寓意是,当出现问题时,您应该查看编译器的警告并修复它们。警告是有原因的!
【解决方案2】:

使用 dumpbin(windwos) 或 nm(linux) 从 DLL 中列出您的导出函数

看看有没有导出five()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多