对 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"。
我认为这很奇怪,因为函数 conj 在 complex.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 to
conj'
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
.
的简单地址
我不知道如何解决 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"。
我认为这很奇怪,因为函数 conj 在 complex.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 functionmain': C:/Users/Machine/Desktop/myapp/myapp.c:9: undefined reference to
conj' 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
.