我在Windows中安装了MinGW编译器。并且有一个项目设置,其中一些第三方*.a
文件直接从Linux机器上复制。
尝试编译一个简单的C程序,当我查看*.o
文件的符号表时,它有所有符号名称的前导下划线。
示例程序:
int main(int argc, char** argv)
{
int xyz=0;
printf("I am Here\n");
}
SymbolTable条目:
Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000040 00000000 00000000 0000008c 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 00000000 2**2 ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000000 2**2 ALLOC SYMBOL TABLE: [ 0](sec -2)(fl 0x00)(ty 0)(scl 103) (nx 1) 0x00000000 abcd01.c File [ 2](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x0000000b **_main** [ 3](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text AUX scnlen 0x3e nreloc 4 nlnno 0 [ 5](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .data AUX scnlen 0x0 nreloc 0 nlnno 0 [ 7](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss AUX scnlen 0x0 nreloc 0 nlnno 0 [ 9](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000000 ___main AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0 [ 11](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __alloca [ 12](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 **_printf** RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE 00000020 DISP32 __alloca 00000025 DISP32 ___main 00000033 dir32 .text 00000038 DISP32 **_printf**
这里甚至基本C函数都以下划线为前缀。
尝试使用-fno-leading-underscore
,但没有用。
MingW版:
$ gcc -v Reading specs from C:/PROGRA~1/GNUCFO~1//ncbin/../lib/gcc-lib/i386-pc-mks/3.3.1/ specs Configured with: configure --prefix=/usr/gnu i386-pc-mks --enable-languages=c,c+ + --disable-nls --disable-shared --enable-sjlj-exceptions --enable-threads --dis able-win32-registry Thread model: win32 gcc version 3.3.1 (mingw special 20030804-1)
答案 0 :(得分:3)
您可能不想要尝试使用在Linux下生成的*.a
个文件(或其中的*.o
个文件)。
这些东西是为Linux环境编译的,你几乎肯定会发现CygWin中的ABI(应用程序二进制接口)是不同的。
CygWin为您提供了类似于Linux的编程环境,因此您可以编译相同的代码。从这个意义上说,它在API(应用程序编程接口)层兼容,不一定是ABI层。