我无法弄清楚如何解决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>
答案 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
的简单地址。