我不知道如何解决 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/