在MinGW的使用scriptedmain麻烦(Trouble using scriptedmain

2019-07-31 13:03发布

我想重现这一Perl代码在C,捆绑API和CLI在相同的C源代码文件( scriptedmain )。 这是在Python进行与if __name__=="__main__": main()和在gcc / Unix下,这看起来像:

$ gcc -o scriptedmain scriptedmain.c scriptedmain.h
$ ./scriptedmain
Main: The meaning of life is 42
$ gcc -o test test.c scriptedmain.c scriptedmain.h
$ ./test
Test: The meaning of life is 42

scriptedmain.h

int meaning_of_life();

scriptedmain.c

#include <stdio.h>

int meaning_of_life() {
    return 42;
}

int __attribute__((weak)) main() {
    printf("Main: The meaning of life is %d\n", meaning_of_life());

    return 0;
}

test.c的

#include "scriptedmain.h"
#include <stdio.h>

extern int meaning_of_life();

int main() {
    printf("Test: The meaning of life is %d\n", meaning_of_life());
    return 0;
}

然而,当我尝试用gcc /草莓编译,我得到:

C:\>gcc -o scriptedmain scriptedmain.c scriptedmain.h
c:/strawberry/c/bin/../lib/gcc/i686-w64-mingw32/4.4.3/../../../../i686-w64-mingw32/lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o): In function `main':
/opt/W64_156151-src.32/build-crt/../mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

当我尝试用gcc / MinGW的编译,我得到:

$ gcc -o scriptedmain -mwindows scriptedmain.c scriptedmain.h
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

我怎样才能获得GCC在Windows识别__attribute__((weak))语法?

此外,G ++示出了同样的错误。

Answer 1:

我发现,在Windows和Unix中有效的解决方案:简单包装main()它省略它,除非明确的编译器标志被设置在预处理指令。

scriptedmain.c:

#include <stdio.h>

int meaning_of_life() {
    return 42;
}

#ifdef SCRIPTEDMAIN

int main() {
    printf("Main: The meaning of life is %d\n", meaning_of_life());

    return 0;
}

#endif

现在main()将被完全忽略,除非你编译

gcc -o scriptedmain -DSCRIPTEDMAIN scriptedmain.c scriptedmain.h

此代码是安全的导入到其他C代码,因为预处理器将去掉main()让你编写自己的主。 最好的部分是,这种解决方案不再依赖于模糊的编译器宏,只有简单的预处理指令。 该解决方案适用于C ++为好。



Answer 2:

这是不是在C好的做法与操作系统无关。 对于任何足够复杂的用C的最佳做法是值得分成库和驱动程序是把main文件中的所有本身。



文章来源: Trouble using scriptedmain in MinGW