未定义引用conj,conjf,conjl

时间:2015-06-27 22:23:55

标签: c gcc mingw codeblocks

我无法弄清楚如何解决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 ),
一个错误结果,说:&#34;未定义引用conj&#34;。

我认为这是一个额外的,因为函数 conj complex.h 中定义,因为函数 cexp 是,但是引用 cexp 似乎效果很好。

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

这是海湾合作委员会的一个特殊问题吗? 我如何配置CodeBlock来解决这个问题?
提前致谢。

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

  

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:在函数main': C:/Users/Machine/Desktop/myapp/myapp.c:9: undefined reference to conj&#39;     obj \ Debug \ test.o:test.c :(。data + 0x4):未定义引用`conj&#39;     collect2.exe:错误:ld返回1退出状态

另外:我已经尝试在CodeBlocks的多个位置编写 -lm 选项而没有任何成功(例如,在“设置/编译器/其他”选项中) ,或设置/编译器/链接器,或项目/构建选项......等)。

MOREOVER:函数conj定义为&#34; inline&#34;由MinGW32在 complex.h 中。我认为这可能是问题,但使用选项 -fno-inline 没有任何影响。

NM计划:按照 o11c 的建议,我使用了 nm 程序。获得以下输出:

<snip, not what was needed>

2 个答案:

答案 0 :(得分:4)

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

我已在mingwrt-3.21修复了此问题,因此您应确保使用该问题,(最好是mingwrt-3.21.1版本)。

答案 1 :(得分:0)

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

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

要解决此问题,请添加

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

等。 - 您可以获取这些地址,如果conj变为非内联,则该函数应优化为conj的简单地址。