6

いくつかのフォルダに多数のC++ファイルが配布されています。

a_library/
    file1.cpp
    file2.cpp
    category1/
        file3.cpp
        file4.cpp

それらは一意の名前が付けられることが保証されています。obj/これらすべてのC++ファイルをコンパイルして、ディレクトリ内のオブジェクトファイルを分離したいと思います。

相対パスを持つすべてのソースファイルとそれに対応する宛先名のリストがあります。

a_library/file1.cpp
a_library/file2.cpp
a_library/category1/file3.cpp
a_library/category1/file4.cpp

obj/file1.obj
obj/file2.obj
obj/file3.obj
obj/file4.obj

最初のリストのC++ファイルを2番目のリストのオブジェクトファイルに変換するルールを作成するにはどうすればよいですか?

これらの試みは機能しませ

obj/%.obj: %:cpp
    # ...

%.obj: %.cpp
    # ...

.cpp.obj:
    # ...

私はこのようなルールを書きたくない:

obj/%.obj: a_library/%.cpp
    # ...

obj/%.obj: a_library/category1/%.cpp
    # ...
4

5 に答える 5

5

設定してみてくださいVPATH

VPATH = a_library:a_library/category1
obj/%.o: %.cpp
    $(CXX) -c $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) -o $@ $<

そして、完全なファイルリスト(ファイルを明示的にリストすることをお勧めします。$(wildcard ...)関数は使用しないでください)とアプリケーションのリンクを追加するには:

files := main.cpp $(wildcard a_library/*.cpp) a_library/category1/file.cpp

obj/application: $(patsubst %.cpp,obj/%.o,$(notdir $(files)))
    $(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $+

$(wildcard)、1回限りのテストファイルや一時ファイル(適切な名前が付いている場合)など、ディレクトリ内のすべてのものを取得するという厄介な傾向があります~file.cpp

于 2012-07-26T10:50:07.617 に答える
1

私が考えることができる1つの解決策は、単純なルールを使用してそれらをインプレースで構築し、「収集フェーズ」を作成して「.o」ファイルを単一のフォルダーに移動することです。

$(OBJS)に依存する「collect_objs」ターゲットを作成してから、「main」ターゲットは「collect_objs」に依存する必要があります。

トラバーサルはシェルを使用して実行できます

dirs := $(shell find ./ -type d)
collect_objs: $(dirs)
      for d in $+; do \
          mv *.o YourDestDir/*.o
      done

もちろん、これは、Windowsを使用しているため、UnxUtilsパッケージ(「find」および「mv」を使用)またはCygwinを使用することを意味します。

The other option is to generate the targets for each of your .c/.cpp file explicitly, using some tool. Grab python, traverse source directories and for each .c/.cpp file write

obj/file_name.o:
       gcc -c path/fo/file_name.c -o obj/file_name.o
于 2012-07-26T10:09:21.990 に答える
0

標準的な方法はMakefile、各フォルダにを入れて、で再帰的に呼び出すことです。include

これは、10^100での最初の2つのヒットでした。

http://owen.sj.ca.us/~rk/howto/slides/make/slides/makerecurs.html

http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Recursion.html

于 2012-07-26T12:07:18.350 に答える
0

cmakeを使用して、ビルド構成を作成します。

少し前に、 githubで簡単なサンプルプロジェクトを設定しました。

于 2012-07-26T10:14:07.300 に答える
0

Makeとは関係がないので、この質問とは厳密には関係ありませんが、3年後の今のプロジェクトのコンパイル方法を示したいと思います。Craftrは、Pythonベースのメタビルドシステムであり、間接的なツリー外ビルド(たとえばbuild、作業ツリー内)を促進します。オブジェクトファイルの作成と静的ライブラリの作成は、次のように簡単です。

# craftr_module(my_project)
from craftr import *
from craftr.ext.platform import cxx, ar
objects = cxx.compile(
  sources = path.platform('**/*.cpp'),
)
lib = ar.staticlib(
  output = 'myproj',
  inputs = [objects],
)

実行craftr -ebすると、ビルド製品の次の構造になります

Craftfile
file1.c
file2.c
category1/
  file3.c
  file4.c
build/
  my_project/
    obj/
      file1.o
      file2.o
      category1/
        file3.o
        file4.o
    libmyproj.a
于 2015-12-25T22:02:23.103 に答える