我不知道如何解决 GCC 中的这个链接问题。
我在 Windows 8、GCC+MingWG 4.8.1 下运行 CodeBlocks 13.12。
我创建了一个包含两个文件的项目:

main.c

#include <complex.h>
int main(void)
{
    double complex (*FUNC)(double complex) = conj;
    return 0;
}

test.c
#include <complex.h>
double complex (*CEXP)(double complex) = cexp;
double complex (*CONJ)(double complex) = conj;

当项目在 CodeBlocks 中编译时(我只使用编译器选项 -std=c11 ),
结果出现错误,说:“未定义对 conj 的引用”。

我认为这很奇怪,因为函数 conjo 是在 complex.h 中定义的,就像函数 cexp 是一样,但是对 cexp 的引用似乎运行良好。

另一方面,在文件 main.c 中引用 conjo 不会触发错误。
(抱歉:这个错误似乎也是在 main.c 中触发的)

这是 GCC 的一个特殊问题吗?
我必须如何配置 CodeBlocks 来解决这个问题?
提前致谢。

更多信息。编译器窗口在 CodeBlocks 中显示这些行:



ALSO: 我已经尝试在 CodeBlocks 的几个地方写选项 -lm 没有任何成功(例如,在设置/编译器/其他选项,或设置/编译器/链接器,或项目/构建选项.. 。, 等等。)。

MOREOVER: 函数 conj complex.h 中被 MinGW32 定义为“内联”。我怀疑这可能是问题所在,但使用选项 -fno-inline 没有任何效果。

NM 程序: 根据 o11c 的建议,我使用了 nm 程序。得到以下输出:
<snip, not what was needed>

最佳答案

好的,我想我明白你现在的问题所在了;您正在尝试获取 conj()cexp() 的入口点地址,它适用于 cexp() ,但不适用于 conj() 。解释是 cexp() 是一个真正的外部函数,您可以获得一个地址,但是,如果您使用的是 mingwrt-3.x 之前的 mingwrt-3.21 ,(或任何损坏的,现在撤回的 mingwrt-4.x 版本), conj() 被实现为 __inline__ ,没有对应的外部实现,所以没有办法得到它的地址。

我已经在 mingwrt-3.21 中解决了这个问题,所以你应该确保你正在使用它(最好是 mingwrt-3.21.1 版本)。

关于c - 对 conj、conjf、conjl 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31094138/

10-10 00:59