具有主要功能的多个源文件

时间:2013-07-05 05:05:55

标签: c configuration project sample

出于学习目的,我希望项目包含多个源文件,每个文件都有自己的main函数。怎么可能实现这个目标? 我要做的是将所有C文件放在同一个项目中,并有选择地编译我目前正在处理的文件。或者更好的是,将文件的名称作为参数提供给程序,以便它可以执行它:

例如在我的main.c我想要(sample*_main个函数位于不同的文件中):

int main(int argc, char ** argv) {
    if (argc > 0)  {
        if (strstr(argv[0], "sample1")) return sample1_main(argc, argv);
        else if (strstr(argv[0], "sample2")) return sample2_main(argc, argv);
// etc...
    }
printf("Not sure what I should run.\n");
return -1;
}

然后像这样执行程序:main.exe sample1

当编译此类项目时,我遇到的问题是“多个定义”错误,当某些函数在sample * .c文件之间共享名称时。

3 个答案:

答案 0 :(得分:0)

你似乎正走在正确的道路上。

为了实现目标,您可以采用以下方式:

  1. 将您的示例代码中的几个main()重命名为sample1_main()sample2_main() ...(这可以避免multiple definition of错误btw)
  2. 保留帖子中的main()
  3. 以这种方式修改您的makefile,根据您要运行的样本,构建的可执行文件称为sample1sample2,...(对于gcc,选项{{1} }指定可执行文件的名称)
  4. 按名称调用可执行文件,即-osample1或....无需传递ayn参数。
  5. 就是这样! : - )

    此行为的原因是sample2是可执行文件本身的名称。

答案 1 :(得分:0)

听起来您希望能够选择在运行时执行的“main”函数,而不是编译时。一种方法是将它们定义为单独的“入口点”函数,然后根据命令行参数选择在main函数中运行的函数。

所以你要定义main.c,sample1.c,sample2.c等,在main.c中你会有这样的东西:

int main(int argc, char **argv) {
  char *methodToExecute;

  if (argc < 2) {
    printf("usage: main.exe <sample_name>\n");
    exit(-1);
  }

  methodToExecute = argv[1]; /* argv[0] is 'main.exe' */

  if (strcmp(methodToExecute, "sample1") == 0) {
    return sample1();
  }
  else if (strcmp(methodToExecute, "sample2") == 0) {
    return sample2();
  }

  /* etc. */
  else {
    printf("method not found: %s\n", methodToExecute);
    exit(-1);
  }
}

答案 2 :(得分:0)

您可以将用于其他文件中的主要功能。编译为库时,将其定义为sample1_main (使用gcc -D选项),否则定义为main。尝试类似的事情,

sm1.c:

#include <stdio.h>

#ifndef S1_MAIN
 #define S1_MAIN main
#endif

int S1_MAIN( int argc, char ** argv)
{

    printf( "This is (sample1_main)\n" );
    return 0;
}

sm2.c:

#include <stdio.h>

#ifndef S2_MAIN
 #define S2_MAIN main
#endif

int S2_MAIN( int argc, char ** argv)
{

    printf( "This is (sample2_main)\n" );
    return 0;
}

main.c中:

#include <stdio.h>
#include <string.h>

int sample1_main(int , char ** );
int sample2_main(int , char ** );

int main(int argc, char ** argv)
{
    if (argc > 1)
    {
            if (strstr(argv[1], "sample1")) return sample1_main(argc, argv);
            else if (strstr(argv[1], "sample2")) return sample2_main(argc, argv);
    }
    printf("Not sure what I should run.\n");
    return 0;
}

编译: (作为单个二进制文件)

gcc -Wall -DS1_MAIN="sample1_main" -DS2_MAIN="sample2_main" main.c sm1.c sm2.c -o main

./main
Not sure what I should run.
./main sample1
This is (sample1_main)
./main sample2
This is (sample2_main)

编译: (作为单独的二进制文件)

gcc -Wall sm2.c -o sm2
gcc -Wall sm1.c -o sm1
./sm1
This is (sample1_main)
./sm2
This is (sample2_main)

注意:我已修复主文件以检查命令行参数。