是否有一个GCC编译器/链接器选项来更改main的名称?

Art*_*ldt 15 c gcc program-entry-point entry-point

我的软件有一个主要用于正常使用,另一个用于单元测试.如果gcc有一个选项来指定使用哪个"主要"功能,我会喜欢它.

Car*_*rum 14

这里的其他答案是非常合理的,但严格来说,你遇到的问题不是GCC的问题,而是C运行时.您可以使用-e标志来指定程序的入口点ld.我的文档说:

-e symbol_name

指定主可执行文件的入口点.默认情况下,条目名称是"start",它位于crt1.o中,其中包含需要设置的胶水代码并调用main().

这意味着您可以根据需要覆盖入口点,但是您可能不希望为要在计算机上正常运行的C程序执行此操作,因为start可能会在程序运行之前执行所需的各种操作系统特定的操作.如果你可以实现自己的start,你可以做你想要的.

  • 在Linux上:1)你还需要`-nostartfiles`用于GCC,否则`crt1.o`中的`main`将是未定义的并且它不会链接2)你必须以显式的`exit()`退出,或者否则`return`到无处将是段错3)`argv`将不会为你设置 (3认同)

Bil*_*eal 9

将它们放在单独的文件中,并指定一个.c文件以供正常使用,并指定一个.c文件进行测试.

或者,#define使用测试版本在命令行上进行测试并使用如下内容:

int main(int argc, char *argv[])
{
#ifdef TESTING
    return TestMain(argc, argv);
#else
    return NormalMain(argc, argv);
#endif
}

int TestMain(int argc, char *argv[])
{
    // Do testing in here
}

int NormalMain(int argc, char *argv[])
{
    //Do normal stuff in here
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,仅仅是对OP的FYI,只需将`-DTESTING`添加到gcc的参数列表中. (7认同)

Pau*_*aul 7

我假设您正在使用Make或类似的东西.我将创建两个包含main函数的不同实现的文件,然后在makefile中定义两个独立的目标,这些目标对其余文件具有相同的依赖性,除了一个使用"unit test main"而另一个使用"normal main" ".像这样的东西:

normal: main_normal.c file1.c file2.c
unittest: main_unittest.c file1.c file2.c
Run Code Online (Sandbox Code Playgroud)

只要"普通"目标更接近makefile的顶部,那么输入"make"将默认选择它.您必须输入"make unittest"来构建测试目标.

  • +1:我非常喜欢这种方法,试图将两个主电源都塞入同一个主程序中,并在它们之间切换预处理器定义或链接器选项. (4认同)

dra*_*ard 7

您可以使用宏将一个函数重命名为main.

#ifdef TESTING
#define test_main main
#else
#define real_main main
#endif

int test_main( int argc, char *argv[] ) { ... }
int real_main( int argc, char *argv[] ) { ... }
Run Code Online (Sandbox Code Playgroud)


Pet*_*ham 6

我倾向于使用不同的文件,并进行测试和生产构建,但如果你确实有一个文件

int test_main (int argc, char*argv[])
Run Code Online (Sandbox Code Playgroud)

int prod_main (int argc, char*argv[])
Run Code Online (Sandbox Code Playgroud)

然后选择一个或另一个作为主要的编译器选项是-Dtest_main=main-Dprod_main=main

  • 也许值得指出的是,如果由于某种原因您无法重命名生产文件中的 main(如我的情况),您可以在 -D 开关中交换符号名称,即在编译生产主体。 (2认同)

小智 5

我今天遇到了同样的问题:m1.c和m2.c都有一个主要功能,但需要链接并运行其中一个.解决方案:用户STRIP在编译之后但在链接之前从其中一个中删除主符号:

gcc -c m1.c m2.c;  strip --strip-symbol main m1.o; gcc m1.o m2.o; ./a.out
Run Code Online (Sandbox Code Playgroud)

将从m2运行主要

gcc -c m1.c m2.c;  strip --strip-symbol main m2.o; gcc m1.o m2.o; ./a.out
Run Code Online (Sandbox Code Playgroud)

将从m1运行main

没有条带:

gcc - m1.c m2.c
m2.o: In function `main':
m2.c:(.text+0x0): multiple definition of `main'
m1.o:m1.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)