1

出于学习的目的,我想要一个包含多个源文件的项目,每个源文件都有自己的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.exesample1

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

4

3 回答 3

1

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

为了达到您的目标,您可以采取以下方式:

  1. main()将您的示例代码中的几个 s 重命名为sample1_main(), sample2_main()... (这避免了multiple definition of错误顺便说一句)
  2. 保持main()原样
  3. 以这样的方式修改您的makefile,根据您要运行的示例,构建的可执行文件称为sample1, sample2, ... (对于 gcc,该选项-o指定可执行文件的名称)
  4. 通过其名称调用可执行文件,即sample1or sample2or .... 无需传递 ayn 参数。

而已!:-)

这种行为的原因是argv[0]可执行文件本身的名称。

于 2013-07-05T05:45:11.017 回答
0

听起来您希望能够选择在运行时而不是编译时执行的“主”函数。一种方法是将它们定义为单独的“入口点”函数,然后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);
  }
}
于 2013-07-05T05:50:33.707 回答
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;
}

主.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)

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

于 2013-07-10T05:42:46.963 回答