Cygwin g ++ - unresolved-symbols = ignore-all

时间:2018-04-12 14:30:33

标签: c++ gcc g++ cygwin ld

我有一个简单的证明案例文件,名为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 实际上是一个可接受的命令。

我的问题是:

  • 有没有办法查看gcc
  • 真正接受哪些命令
  • 还有其他方法可以使用cygwin的gcc来编译这个main.c示例吗?
  • 使用正确的选项从源代码编译gcc可能会让--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()函数。

我确实知道有些工具可以自动创建模拟,但我希望能够让它工作。

感谢您阅读。

0 个答案:

没有答案