web-dev-qa-db-ja.com

CMakeプロジェクトで単一のファイルをコンパイルしますか?

私はC++プロジェクトを開発していますが、これはより大きなプロジェクトに含まれる予定です。

より大きなプロジェクト(Qtアプリケーションであり、qmakeから生成されている)では、特定のファイルへの相対パスを引数として入力するだけで、Linuxコマンドラインから単一のファイルをコンパイルできることを確認しました。

一方、私は自分のプロジェクトにCMakeを使用しています。コンパイルユニットのコードを変更し、そのヘッダーファイルを変更する必要がある場合、依存関係をコンパイルしてから独自のソースファイルをコンパイルするまで長時間待つ必要があります。ただし、*。ccファイルのソースコードがエラーなしでコンパイル可能かどうかを確認したい場合があります。

Qmakeがこれを行う方法でCMakeからMakefileを生成する方法はありますか? qmakeへの切り替えはもうオプションではありません。

12
pacorrop

CMakeによって生成されたMakefileにはすでに各.ccファイルの.oターゲットが含まれているため、CMakeスクリプトにカスタムターゲットを追加する必要はありません。例えば。 mySourceFile.ccというソースファイルがある場合、ビルドディレクトリに<Some Path>/mySourceFile.cc.oというターゲットを定義するMakefileがあります。ビルドディレクトリにcdする場合は、grepまたはack-grepを使用してこのターゲットを定義するMakefileを見つけ、cdをそのMakefileのディレクトリに入れてビルドします。それ。

例えば。コマンドack-grep mySourceFile.cc.oが次のようなものを出力するとします。

foo/bar/Makefile
119:x/y/z/mySourceFile.o: x/y/z/mySourceFile.cc.o
123:x/y/z/mySourceFile.cc.o:
124:    # recipe for building target

次に、次の手順でmySourceFile.cc.oを作成できます。

cd foo/bar && make x/y/z/mySourceFile.cc.o
20
Ose

CMakeにはこれを行うための一般的な組み込みの方法はありません(これは 未解決の問題 です)が、Ninjaジェネレーターを使用している場合は、 特別なNinja構文)を使用できます 指定されたソースファイルの直接出力のみをビルドする場合。たとえば、foo.oだけをコンパイルするには、次を使用します。

ninja /path/to/foo.cpp^
8
nocnokneo

箱から出していない。 CMakeは、メインのメイクファイルでこれらの「内部」メイクファイルルールを公開しません。

これは、CMakeが内部で使用するファイル構造の種類を検討する場合にのみ実行できます。あなたは例えばすることができますCMakeで生成されたmakefile呼び出しを使用して単一の.objファイルをコンパイルする場合

make -f CMakeFiles/myProg.dir/build.make CMakeFiles/myProg.dir/main.cc.obj

あなたがのようなものを持っているとき

cmake_minimum_required(VERSION 3.1)

project(myProg CXX)

file(WRITE "main.cc" "int main()\n{\nreturn 0;\n}") 
add_executable(myProg main.cc)
6
Florian

Src/foo.cppを単独でビルドするには:

cmake --build . --target src/foo.cpp.o
2
il--ya

.cpp.oファイル名からターゲット名(.cppで終わる)を見つける方法を提案している人もいますが、.cppファイルのコンパイルをトリガーするターゲットの名前をすでに知っている場合は忍者を使用している場合、この提案は簡単なはずです。

最初にターゲットを作成します。

ninja TriggersCppCompilationLib

ファイルが変更されたか、まだビルドされていないと仮定すると、忍者は完全なターゲット名を出力します。名前が表示されたら、Enterキーを押して、上書きされないようにします。次に、端末から名前をコピーするだけです(たとえば、tmuxコピーモードを使用します)。

1
davidvandebunte

いいえ、CMakeは単一ファイルをコンパイルするための組み込みサポートを提供していません。

ディレクトリのすべてのファイルを反復処理する関数によって、各オブジェクトファイルのターゲットを追加する必要があります。

0
usr1234567