我有一个简单的证明案例文件,名为main.c
void bar(void);
void foo(void)
{
bar();
}
int main(void)
{
return 0;
}
正如您所看到的,bar()
没有定义我的目标是使用 cygwin的gcc 在 windows 上编译。
我已经发现我可以使用以下链接器选项:
--unresolved-symbols=ignore-all
这应该告诉链接器不要关心丢失的符号。在main.c示例中,缺少的符号甚至不是问题,因为永远不会调用foo,因此在执行程序时不应该有未定义的行为。
我有2种gcc,一种用于嵌入式ARM目标,另一种来自cygwin 64bit for windows。
嵌入式ARM gcc来自:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm,版本4_9-2015q3。
Cygwin gcc取自https://cygwin.com的64位安装程序,版本7.3.0-1
我在编译器中使用这些编译选项:
arm-none-eabi-g++.exe -Wl,--unresolved-symbols=ignore-all main.c
g++.exe -Wl,--unresolved-symbols=ignore-all main.c
第一个编译和链接没有错误,第二个我收到此错误消息:
/cygdrive/c/Users/user/AppData/Local/Temp/ccRF8tf5.o:main.c:(.text+0x9): undefined reference to `bar()'
/cygdrive/c/Users/user/AppData/Local/Temp/ccRF8tf5.o:main.c:(.text+0x9): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `bar()'
collect2: error: ld returned 1 exit status
显然未定义对`bar()'的引用应该被选项 -Wl, - unresolved-symbols = ignore-all
(如果我使用32位cygwin安装程序中的gcc,则不会出现第二条错误消息。)
cygwin ld 的--help命令显示 - unresolved-symbols = ignore-all 作为有效选项。
我认为cygwin gcc的编译方式是这个选项不起作用,即使它没有抱怨它无法验证这个选项。
例如,如果我使用此命令:
g++.exe -Wl,--unresolved-symbols=dummy main.c
我收到此错误消息:
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: bad --unresolved-symbols option: dummy
对我来说, - unresolved-symbols 实际上是一个可接受的命令。
我的问题是:
我的动机对于这件事我想要从具有多个功能的大文件中单个测试单个函数。如下例所示:
#include "foobar.h"
int foo(void)
{
return 0;
}
void bar(void)
{
foobar();
}
foobar()的声明在foobar.h中,定义在另一个名为foobar.c的文件中。
如果我想运行一个单元测试,它只是链接符号 foo(),我仍会收到链接器错误,因为 foobar()缺少符号。 (链接反对foobar.o会导致我链接到完整的依赖链,我想避免)
如果 - unresolved-symbols 选项有效,那么我就不需要在单元测试中模拟或存根foobar()函数。
我确实知道有些工具可以自动创建模拟,但我希望能够让它工作。
感谢您阅读。