2

我想用 C 语言重现这个 Perl 代码,将 API 和 CLI 捆绑在同一个 C 源代码文件(scriptedmain)中。这是在 Pythonif __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

脚本main.h

int meaning_of_life();

脚本main.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;
}

测试.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/Strawberry 进行编译时,我得到:

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++ 显示相同的错误。

4

2 回答 2

1

我找到了一个适用于 Windows 和 Unix 的解决方案:只需将main()预处理器指令包装起来,除非设置了显式编译器标志,否则会忽略它。

脚本main.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

Nowmain()将被完全省略,除非您使用

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

这段代码可以安全地导入到其他 C 代码中,因为预处理器会去掉main(),让您编写自己的 main.js 代码。最好的部分是这个解决方案不再依赖于晦涩的编译器宏,只依赖于简单的预处理器指令。该解决方案也适用于C++

于 2012-09-13T00:35:15.207 回答
-1

无论操作系统如何,这都不是 C 语言中的好习惯。对于任何复杂到值得将其分离为库和驱动程序的东西,C 中的最佳实践是单独放入main一个文件中。

于 2012-09-12T19:42:11.583 回答