4

私は、すべての主要なオペレーティング システム用にコンパイルできる C プログラムを作成する方法を見つけようとしています。ターゲットOSを変えるだけでいいので、makefileを使うことも考えたのですが、いくつか問題があります。私の最初の問題は、ターゲット OS を変更して、1 つの OS でコンパイルし、すべての OS でアプリケーションを使用できるようにする方法がわからないことです。2 つ目の問題は、src ディレクトリ内のすべての .c ファイルを自動的にコンパイルする方法がわからないため、新しいファイルを追加するたびに makefile を変更する必要がないことです。誰もこれを行う方法を知っていますか?

私の現在のmakefile(現在、ここから変更されていません)

CC=gcc
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@q2
4

1 に答える 1

6

GNU Autoconf は、開始するのに適した場所です。nmake スクリプトのセットを維持する以外に、Windows で何をするかがわからないため、完全な回答を提供することはできません。習得には時間がかかりますが、プラットフォーム間で機能するメイク ファイルと C コードを作成できるようになります。複数のソース ファイルを処理するだけでなく、「all」、「install」、「clean」などのターゲットを定義するのにも役立ちます。プロジェクトをダウンロードしてから「./configure」と入力してから'make install' の場合、おそらく Autoconf で生成されたプロジェクトのユーザーでした。

複数のソース ファイルを処理するだけでなく、Autoconf を使用する理由は他にもあります。

Unix のフレーバーにまたがる C/C++ 開発を困難にしているのは、「Unix」と C の定義です。Unix の異なるフレーバーは、サポートする標準のフレーバーに応じて、ライブラリまたはシステム コールがわずかに異なります。同じことが C にも当てはまります。そのため、コードを記述するときに、使用したい Unix と C のバージョンを定義するプリプロセッサ シンボルのグループを指定する #defines が表示されます。GCC から HP C または他のベンダーの C コンパイラに移行すると、さまざまな「デフォルト」レベルの動作が含まれる場合があるため、期待される動作を明示する必要があります。

次に、必要なライブラリを定義する必要があります。ビルドでは、mysql ライブラリをプローブし、それらのライブラリがインストールされていない場合の対処方法を決定する必要がある場合があります。まったくビルドする必要がない場合もあれば、別のライブラリ (libdb など) に置き換えるだけの場合もあります。2 つのオペレーティング システム (Solaris と Linux) をサポートするために複雑な makefile を作成しようと試みたので、この車輪を再発明したくはありません。

于 2013-03-05T21:43:06.883 に答える