21/06/12 20:27:30.69 rWz1JMsc.net
CMakeLists.txtの標準的な記述方法は以下の通りです。
【ここから】
# CMakeLists.txt --- CMake project settings
# ex) cmake -G "Visual Studio 9 2008" .
# ex) cmake -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" .
##############################################################################
# CMake minimum version
cmake_minimum_required(VERSION 3.0)
# project name and languages
project(MyProject C CXX)
##############################################################################
# program.exe
add_executable(program file1.cpp file2.cpp)
##############################################################################
【ここまで】
「#」で始まる行はコメントです。
3:蟻人間
21/06/12 20:30:21.33 rWz1JMsc.net
Win32アプリの場合のCMakeLists.txtの記述方法は以下の通りです。
【ここから】
# CMakeLists.txt --- CMake project settings
# ex) cmake -G "Visual Studio 9 2008" .
# ex) cmake -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" .
##############################################################################
# CMake minimum version
cmake_minimum_required(VERSION 3.0)
# project name and languages
project(MyProject C CXX RC)
##############################################################################
# program.exe
add_executable(program WIN32 file1.cpp file2.cpp program_res.rc)
target_link_libraries(program comctl32)
##############################################################################
【ここまで】
Win32の場合は「RC」と「WIN32」を付けるのを忘れないで下さい。
テンプレここまで。
4:蟻人間
21/06/12 20:42:39.14 rWz1JMsc.net
>>1
訂正。CMakeLists.txtです。Listsは複数形です。
5:蟻人間
21/06/12 22:27:30.80 bymgAWyc.net
質問1. なぜMakefileを直接使わないの?
答え. Makefileには方言があって機種依存になっているため、あっちのMakefileがこっちで動かないことが多く、
開かれた幅広いサポートには不向きです。また、ビルドに関係ない記述も多く、移植作業の無駄になります。
CMakeはマルチプラットフォーム対応を少ない作業で実現します。
6:蟻人間
21/06/12 22:39:16.78 rWz1JMsc.net
質問2. ジェネレータって何ですか?
答え. ジェネレータとは何かのデータを生成する「生成器」のことです。
CMakeではビルド環境に対応したジェネレータを選ぶことでビルドができる
ようになります。以下はジェネレータの例です(環境によって異なります):
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>"C:\Program Files\CMake\bin\cmake.exe" -G
CMake Error: No generator specified for -G
Generators
* Visual Studio 16 2019 = Generates Visual Studio 2019 project files.
Use -A option to specify architecture.
...
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Borland Makefiles = Generates Borland makefiles.
NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
...
7:蟻人間
21/06/12 22:45:32.10 rWz1JMsc.net
質問3. Visual Studioでビルドしたい場合はどうすればいいですか?
答え. Visual Studioをインストールした場合は、Visual Studio専用の
コマンドプロンプトがWindowsメニューのプログラムリストの中にあります。
VSコマンドプロンプトを起動して、CDコマンドでソースのあるフォルダに
移動して、cmakeを実行して下さい。NMakeを使う方法と
VSソリューションファイルを使う方法の2種類あります。
cmake -G "NMake Makefiles" .
cmake -G "Visual Studio 16 2019" -A Win32 .
cmake -G "Visual Studio 9 2008 Win64" .
8:蟻人間
21/06/12 23:01:14.67 rWz1JMsc.net
質問4. ビルドを自動化できると何かいいことあるの?
答え. GitHub Actionsなどと組み合わせて退屈なビルド・テスト作業を
自動化すると、人間がしなくていい無駄な仕事がなくなります。
GitHubでコミットしたときに複数の環境で自動ビルド・テストするようにすると、
人間はテスト結果の一覧を見るだけで次のコーディングに進むことができます。
CMakeは自動化・省力化を強力に支援します。
9:蟻人間
21/06/12 23:17:00.91 bymgAWyc.net
自動化するには、バッチ処理や設定などの記述が必要ですが、一度正しく記述できれば、後はクラウド・仮想化・自動化のパワーで
圧倒的な開発手順の革新となります。そのパワーは開発規模が大きいほど効果的です。
10:蟻人間
21/06/12 23:27:34.46 bymgAWyc.net
質問4. CMakeを扱うにはどんな知識・技術が必要?
答え.まず、コマンドプロンプトやシェルスクリプトを少し操れて、コマンドラインやバッチ処理が記述できる程度の技術が必要です。
また、CMakeの記述方法を自分で英語などでウェブ検索して情報を突き止める的確な検索技能が必要になります。
11:蟻人間
21/06/12 23:36:59.18 bymgAWyc.net
例えばCMakeで実行ファイルを作成するには「add_executable」というCMakeコマンドを使用しますが、これの使い方を検索して記述方法を3分の1でも理解できるようなレベルでなければいけません。
ライブラリを作成するには「add_library」というCMakeコマンドを使用します。こういったCMakeコマンドの並びをCMakeLists.txtというファイルに実際に記述するわけです。
12:デフォルトの名無しさん
21/06/13 00:59:20.97 cRYSJGQ8.net
add_testってgoogle testとか外部テストライブラリ使わなくても使用可能なの?
13:蟻人間
21/06/13 01:06:36.03 rRRSYwbM.net
>>12
CMakeに付属するテストツールCTestを使うにはenable_testing()を書かないといけないらしい。
URLリンク(qiita.com)
14:蟻人間
21/06/13 01:11:13.33 rRRSYwbM.net
CMakeをインストールしてれぱCTestも入ってるはず。
15:デフォルトの名無しさん
21/06/13 01:37:26.49 lvxMBUj+.net
>>12
常識的に考えてフレームワークは有ったほうが良いと思います。
16:デフォルトの名無しさん
21/06/13 02:01:13.11 CEo6Ln9Y.net
「はず」ねえ
17:デフォルトの名無しさん
21/06/13 03:36:45.96 8vbdM5AU.net
蟻人間の説明に誤りが多い。このスレは伸びない
18:デフォルトの名無しさん
21/06/13 07:19:07.18 cRYSJGQ8.net
CMakeLists.txtの変数の一覧はどこかで見れる?
19:デフォルトの名無しさん
21/06/13 09:43:26.14 7hKf4K7h.net
完走出来るかはさておき次スレではビルドツール共用で
20:蟻人間
21/06/13 09:57:10.24 grfIiy8/.net
>>18
「cmake variables」で検索すれば次のページが出てくる:
URLリンク(cmake.org)
21:デフォルトの名無しさん
21/06/13 13:16:26.94 cRYSJGQ8.net
CMakeのプロジェクトのなかで変数一覧が記載されたファイルとかないの?
22:蟻人間
21/06/13 13:59:51.46 grfIiy8/.net
>>21
cmakeに成功すると、CMakeCache.txtというファイルができる。
この中に変数の設定内容が一時的に保存されている。
23:蟻人間
21/06/13 15:30:14.97 otNLJkw4.net
間違えずに書く自信のある人なら、CMakeCache.txtに書かれてる内容を直接書き換えてもいい。
24:デフォルトの名無しさん
21/06/14 10:48:01.94 LnG83xz5.net
>>17
蟻は調べながら受け売りコピペしてるだけ
結局自分で調べた方が早い
25:デフォルトの名無しさん
21/06/14 13:15:02.79 shEIUH7U.net
調べて載せてくれてるならいいじゃないのコピペだって
多少の間違いは周りが訂正してあげれば十分
そんな叩いてばかりしてたらコミュニティが過疎っしまいますよ
26:デフォルトの名無しさん
21/06/14 16:44:53.08 xr9L9qN8.net
そんなクソコミュニティ、元々いらんのだが。
27:デフォルトの名無しさん
21/06/14 18:27:19.15 6p9bp5Dj.net
糞コミュニティなんていくらでもあるんだから、自分に必要ないと思ったら
寄っていかなきゃいいだけ。
28:デフォルトの名無しさん
21/06/14 18:53:14.11 U7CM/gao.net
Part 1とか付けると2まで伸びないというジンクスがある。
29:デフォルトの名無しさん
21/06/15 01:22:59.73 cmWMd34J.net
いつも思うことだがツールチェインとか特に
便利にしようと思って作ったのは気持ち的にはわからんでもないけど
かえって手間が増えてんだよねえ・・
移植作業が必要だのなんだのいっても普通にMakefileでいいわってなる
たいした手間じゃないしな
他の奴らも全てに精通してるわけじゃないし
30:デフォルトの名無しさん
21/06/15 15:30:47.00 dTl1pSLY.net
cmakeスレも昔いくつかあったな
31:デフォルトの名無しさん
21/06/15 18:46:08.38 jlLB8m57.net
>>29
いや全然違う。
32:デフォルトの名無しさん
21/06/15 20:08:19.27 BeYGJoYp.net
makefileが方言ありすぎてCMake使うようになったってきいた
33:デフォルトの名無しさん
21/06/15 20:23:44.43 ULdPzagS.net
makeに余計なこと書きすぎなのがいけない。酷いのになるとコロンの右側にstdio.hがあったりする。gcc -Mの出力をそのまんま喰わせてる感じ
34:デフォルトの名無しさん
21/06/15 23:41:38.62 0F6z4l8H.net
cmakeは宣言型、makefileは手続型みたいな感じかな
makefileはコマンドやシェルスクリプトを使って何でもできちゃうから他人には読めないようなものになってることがある
35:デフォルトの名無しさん
21/06/16 18:27:05.85 z1aHwQBP.net
makeの場合、環境変数PATHの切り替えで32bit用と64bit用のコンパイラが簡単に切り替えられるが、
cmakeは余計なことをしてくれるので不具合が発生する。
cmake -G "Visual Studio 16 2019" -A Win32 ..
こっちは動くが
cmake -G "Visual Studio 16 2019" -A Win64 ..
こっちは動かない。
ただ、何もしないと勝手にWin64のコンパイラを起動するので指定なしで代用できる。
この時のCMakeLists.txtは自分の書いたものでなくて、そこそこ有名なGitHubのソフトのものなので、
CMakeLists.txtの問題でなく、cmakeそのものの問題だと予想される。
さらに、/MT, /MD, /MTd, /MDdと四種類のライブラリをビルドしようとすると
勝手にコンパイルスイッチをいじられるのでマクロを使って工夫する必要が出てくる。
こういうのを考慮するとcmakeにすると互換性ばっちりとは言い難い。
簡潔なMakefileを書けるなら、そっちで配布した方が結果的に互換性が高いと思う。
36:蟻人間
21/06/16 18:34:48.95 Qk2ktN9D.net
>>35
それはよくある間違いで、Win64ではなくx64を指定しないといけないらしい。
URLリンク(stackoverflow.com)
37:
21/06/16 19:13:04.42 ujIwgEeO.net
昔の教科書で習った make を使うことにしています、内部をしっかり把握しているのでこれが一番いろいろやりやすいのです
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)
38:蟻人間
21/06/16 19:13:45.91 Qk2ktN9D.net
>>35
/MT, /MD, /MTd, /MDdについてだが、CMake 3.15よりMSVC_RUNTIME_LIBRARYという変数が使えるらしい。
URLリンク(cmake.org)
URLリンク(stackoverflow.com)
ターゲットを分けて、それぞれについてset_propertyすれば可能。
add_executable(foo1 foo.c)
set_property(TARGET foo2 PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
add_executable(foo2 foo.c)
set_property(TARGET foo2 PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>")
...
3.15より前は、ちょっとややこしいコードになる。
39:蟻人間
21/06/16 19:17:12.23 Qk2ktN9D.net
>>38
訂正。変数じゃなくてプロパティ。
40:デフォルトの名無しさん
21/06/16 19:33:04.22 Qk2ktN9D.net
>>38
訂正。
「MultiThreadedDLL$<$<CONFIG:Debug>:Debug>」
じゃなくて
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」。
41:蟻人間
21/06/16 19:38:16.75 Qk2ktN9D.net
「$<$<CONFIG:Debug>:Debug>」というのはgenerator expressionsの一種で、
デバッグ版のときは"Debug", リリース版のときは空文字列に展開されるらしい。
つまり、
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」
は、デバッグ版では「MultiThreadedDebugDLL」となり、
リリース版では「MultiThreadedDLL」となる。
なお、MSVC_RUNTIME_LIBRARYを使う場合は、
cmake_minimum_required(VERSION 3.15)の後に
cmake_policy(SET CMP0091 NEW)も付けた方がいいらしい。
42:デフォルトの名無しさん
21/06/16 20:48:17.12 z1aHwQBP.net
そうすると四種類のビルドをやるにはこうすると出来るけど、
[ --build . --config Release ]
この場合のReleaseとDebugとの関係性はどうなるの?
cmake_minimum_required(VERSION 3.15)
set(SRC a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp g.cpp h.cpp i.cpp)
add_library(xx_mt ${SRC})
add_library(xx_md ${SRC})
add_library(xx_mtd ${SRC})
add_library(xx_mdd ${SRC})
set_property(TARGET xx_mt
PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded")
set_property(TARGET xx_mtd
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET xx_md
PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
set_property(TARGET xx_mdd
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreadedDLL$<$<CONFIG:Debug>:Debug>")
target_include_directories(xx_mt PUBLIC "../include")
target_include_directories(xx_md PUBLIC "../include")
target_include_directories(xx_mtd PUBLIC "../include")
target_include_directories(xx_mdd PUBLIC "../include")
43:デフォルトの名無しさん
21/06/16 21:09:31.72 z1aHwQBP.net
うーん、あとこれだと自分で記述する場合はいいけど、
GitHubとかで取ってきたgcc用のtar-ballの移植の場合は
MSVC_RUNTIME_LIBRARYのためのTARGET沢山増設して
CMakeLists.txtが殆ど書き直しに近い状態になるなあ
44:蟻人間
21/06/16 21:25:12.16 woJNV48Q.net
う~ん、ターゲットは二種類でいいんじゃないか。generator expressionsでデバッグとリリースの差異を吸収できるし。
結局、IDEでデバッグ・リリース切り替えないといけないっしょ。
45:デフォルトの名無しさん
21/06/16 21:27:08.88 z1aHwQBP.net
それって二種類書けば --configのDebug/Releaseで四種類そろうって意味?
46:蟻人間
21/06/16 21:33:26.89 woJNV48Q.net
そうだよ。プロパティに指定したgenerator expressionの
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」は、「MultiThreadedDebugDLL」と
「MultiThreadedDLL」になる。
47:デフォルトの名無しさん
21/06/16 21:55:08.14 XZ06lrte.net
共通がたくさんあるのであればfunction()~endfunction()使うのもありじゃない?
URLリンク(cmake.org)
48:デフォルトの名無しさん
21/06/16 21:57:56.14 z1aHwQBP.net
そうなるとこれでいいんだ。ありがとう。
cmake_minimum_required(VERSION 3.15)
set(SRC a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp g.cpp h.cpp i.cpp)
add_library(xx_mt ${SRC})
add_library(xx_md ${SRC})
set_property(TARGET xx_mt
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET xx_md
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreadedDLL$<$<CONFIG:Debug>:Debug>")
target_include_directories(xx_mt PUBLIC "../include")
target_include_directories(xx_md PUBLIC "../include")
49:デフォルトの名無しさん
21/06/16 22:01:08.77 z1aHwQBP.net
>>47
ありだと思う
50:蟻人間
21/06/16 22:07:10.07 woJNV48Q.net
>>48
「DLL」は後ろにつけて。
51:デフォルトの名無しさん
21/06/16 22:11:55.13 z1aHwQBP.net
これが正解になるのかな
cmake_minimum_required(VERSION 3.15)
set(SRC a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp g.cpp h.cpp i.cpp)
add_library(xx_mt ${SRC})
add_library(xx_md ${SRC})
set_property(TARGET xx_mt
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET xx_md
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
target_include_directories(xx_mt PUBLIC "../include")
target_include_directories(xx_md PUBLIC "../include")
52:デフォルトの名無しさん
21/07/11 15:46:00.11 lbKLD5N+.net
結局こうやって人を実験台にする気満々で初めて誰にも相手にされなくなるんだよね。
メタ系の言語を推すバカの末路だわ。
53:蟻人間
21/07/19 23:06:43.32 6UpSDY/2.net
バーカバーカ
ヘビメタだぜ。奉ろうベイビー!
みんな優秀だから質問しなくてもできる。
偉い偉い。
54:デフォルトの名無しさん
21/09/14 01:26:01.72 Mj50vLs9.net
広く使われてるけどあんまり話題がないのな
55:デフォルトの名無しさん
21/09/14 06:15:43.87 pTMW8GY7.net
自作自演の即死スレ
56:デフォルトの名無しさん
21/09/15 11:48:33.99 PYzW5a+n.net
そもそもマルチOSで出そうなんて苦労の割にメリット低いわ。
それもわからんバカがこういうデラックスなツールを使いたがるんだよね。
57:デフォルトの名無しさん
21/09/15 19:05:46.01 5Un5Xbsb.net
VSCodeだけでC++やろうとするとこれが一番楽なんよ。マルチは苦労増えるだけやな
58:デフォルトの名無しさん
21/09/15 23:44:18.94 9XE/xHox.net
cmakeってそんなにデラックスかな?
マルチプラットフォームでなくてもmakefile直書きよりメリットあると思うけど
makefile → コンパイルやリンクなど手続きを記述していく
cmake → 手続きではなく関係性などを定義していく
59:デフォルトの名無しさん
21/09/16 06:19:41.69 QQbmBwad.net
広く使われることを考えてなかったような設計だよな
なんかいまいち近代的じゃない
60:デフォルトの名無しさん
21/09/22 02:27:13.15 H7+/Tu0q.net
>>58
その程度の用途でmakefileも満足に書けないならc/c++での開発なんかするべきじゃない。
61:デフォルトの名無しさん
21/09/22 09:37:25.13 85DYkwM1.net
そんなこといったって・・・
プラットフォームごとに使えるコマンドとか違うじゃん
cmakeに関係性を記述して各プラットフォームごとのMakefileは自動生成のほうが楽なんだもん
62:デフォルトの名無しさん
21/09/22 19:08:29.74 xKA5BBWf.net
大した差ではないし、その差が理解できないやつは問題起きた時に明らかに詰むからやめろや。
63:デフォルトの名無しさん
21/09/22 21:21:13.37 85DYkwM1.net
ごめんね・・
64:デフォルトの名無しさん
21/09/22 22:10:24.97 fOdtASHT.net
でも現実には使われてるからな
個別にmakefileなんて書かない
65:デフォルトの名無しさん
21/09/23 00:37:14.36 1QHTb9H7.net
便利だと思えば自分で使えば良いだけで他人に強制するものではないんだよ
URLリンク(www.tokyo-np.co.jp)
66:デフォルトの名無しさん
21/09/23 10:01:39.72 u1LIdCP+.net
別に強制はしてないから
67:デフォルトの名無しさん
21/09/23 11:42:47.93 AZNHMrAu.net
そうやってexcel方眼紙ができていったわけだけれど。
68:デフォルトの名無しさん
21/09/25 16:56:31.88 wzNzdXVE.net
>>60
C/C++の開発からこそCMakeLists.txtを書くんだよ
69:デフォルトの名無しさん
21/10/04 08:16:59.56 S53xZnhz.net
手元のCのプロジェクトをmakefileからcmakeへ移行したお陰でVSでビルド出来るようになったし、ninjaでもビルド出来るようになって、こっちはビルドが爆速になって良いことしかない
70:デフォルトの名無しさん
21/10/06 17:43:31.95 XJEs7oM2.net
おめ
71:デフォルトの名無しさん
21/12/31 11:32:54.51 +Lg1Sgs9.net
configureオプションとcmakeとを対照できる手段あるかな?
ClamAVのビルドツールがcmakeになってしまったので、指定していたconfigureオプションをcmakeに翻訳してやらないとならない。
72:デフォルトの名無しさん
23/09/21 20:25:44.21 QerBhdvC.net
アレ、なんかすごいことになってるやんか!
73:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています