2

この Perl コードを C で再現し、API と CLI を同じ C ソース コード ファイル ( scriptedmain ) にバンドルしたいと考えています。これは Python とif __name__=="__main__": main()gcc/Unix で行われ、次のようになります。

$ gcc -o scriptedmain scriptedmain.c scriptedmain.h
$ ./scriptedmain
Main: The meaning of life is 42
$ gcc -o test test.c scriptedmain.c scriptedmain.h
$ ./test
Test: The meaning of life is 42

scriptedmain.h

int meaning_of_life();

scriptedmain.c

#include <stdio.h>

int meaning_of_life() {
    return 42;
}

int __attribute__((weak)) main() {
    printf("Main: The meaning of life is %d\n", meaning_of_life());

    return 0;
}

test.c

#include "scriptedmain.h"
#include <stdio.h>

extern int meaning_of_life();

int main() {
    printf("Test: The meaning of life is %d\n", meaning_of_life());
    return 0;
}

ただし、gcc/Strawberry でコンパイルしようとすると、次のようになります。

C:\>gcc -o scriptedmain scriptedmain.c scriptedmain.h
c:/strawberry/c/bin/../lib/gcc/i686-w64-mingw32/4.4.3/../../../../i686-w64-mingw32/lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o): In function `main':
/opt/W64_156151-src.32/build-crt/../mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

そして、gcc/MinGW でコンパイルしようとすると、次のようになります。

$ gcc -o scriptedmain -mwindows scriptedmain.c scriptedmain.h
c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

__attribute__((weak))WindowsでGCCに構文を認識させるにはどうすればよいですか?

また、G++ でも同じエラーが表示されます。

4

2 に答える 2

1

main()Windows と Unix で機能する解決策を見つけました。明示的なコンパイラ フラグが設定されていない限り、それを省略するプリプロセッサ命令をラップするだけです。

scriptedmain.c:

#include <stdio.h>

int meaning_of_life() {
    return 42;
}

#ifdef SCRIPTEDMAIN

int main() {
    printf("Main: The meaning of life is %d\n", meaning_of_life());

    return 0;
}

#endif

main()でコンパイルしない限り、完全に省略されるようになりました

gcc -o scriptedmain -DSCRIPTEDMAIN scriptedmain.c scriptedmain.h

このコードは、他の C コードに安全にインポートできます。これは、プリプロセッサが を取り除きmain()、独自の main をコーディングする必要があるためです。最良の部分は、このソリューションがあいまいなコンパイラ マクロに依存しなくなり、単純なプリプロセッサ命令のみに依存することです。このソリューションは、C++でも機能します。

于 2012-09-13T00:35:15.207 に答える
-1

これは、オペレーティングシステムに関係なく、Cでは適切な方法ではありません。ライブラリとドライバに分離する価値があるほど複雑なものに対するCのベストプラクティスはmain、ファイルをすべて単独で配置することです。

于 2012-09-12T19:42:11.583 に答える