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.exe

私が抱えている問題は、いくつかの関数が sample*.c ファイル間で名前を共有している場合に、そのようなタイプのプロジェクトをコンパイルするときに「複数の定義」エラーが発生することです。

4

3 に答える 3

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)

注:コマンドライン引数をチェックするためにメインファイルを修正しました。

于 2013-07-10T05:42:46.963 に答える