对 conj、conjf、conjl 的未定义引用

undefined reference to conj, conjf, conjl

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

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),
结果出错,说:"Undefined reference to conj"。

我认为这很奇怪,因为函数 conjcomplex.h 中定义为函数 cexp 是,但对 cexp 的引用似乎效果很好。

另一方面,在文件main.c.[=中引用conj不会触发错误。 56=] (SORRY: 似乎错误是在main.c中触发的,还有)

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

更多信息。编译器 window 在代码块中显示这些行:

mingw32-gcc.exe -Wall -g -std=c11 -g -std=c11 -c C:\Users\Machine\Desktop\myapp\myapp.c -o obj\Debug\myapp.o
mingw32-gcc.exe -Wall -g -std=c11 -g -std=c11 -c C:\Users\Machine\Desktop\myapp\test.c -o obj\Debug\test.o
mingw32-g++.exe -o bin\Debug\myapp.exe obj\Debug\myapp.o obj\Debug\test.o
obj\Debug\myapp.o: In function main': C:/Users/Machine/Desktop/myapp/myapp.c:9: undefined reference toconj' obj\Debug\test.o:test.c:(.data+0x4): undefined reference to `conj' collect2.exe: error: ld returned 1 exit status

另外: 我试过在 CodeBlocks 的几个地方写选项 -lm 但没有成功(例如,在Settings/Compiler/Other 选项,或 Settings/Compiler/Linker,或 Project/Build 选项...,等等)。

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

NM program: 根据o11c的建议,我使用了nm程序.得到如下输出:

<snip, not what was needed>

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

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

我也将我对 Keith Marshall 的回答的评论变成了答案(因为评论太长了):

根据 Keith Marshall 的回答,问题是它们是内联的, gcc 没有生成非内联版本。

要解决这个问题,请添加

static double complex conj_ (double complex a)
{
    return conj (a);
}

等- 你可以获取这些地址,如果 conj 变为非内联,函数应该优化为 conj.

的简单地址