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,你可以做你想要的.
将它们放在单独的文件中,并指定一个.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)
我假设您正在使用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"来构建测试目标.
您可以使用宏将一个函数重命名为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)
我倾向于使用不同的文件,并进行测试和生产构建,但如果你确实有一个文件
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
小智 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)
| 归档时间: |
|
| 查看次数: |
8772 次 |
| 最近记录: |