CMakeは、コンパイラに依存しないビルド自動化のためのフリーソフトウェアです。主にC/C++のビルド管理で使用され、様々なビルド環境に対応しています。Windows、Linux、MacどこでもOK。
https://cmake.org/
基本的な使い方はまず、ビルド環境にCMakeをインストールした後で、ビルド方法を記述したテキストファイルCMakeList.txtをソースと同じ場所に作成した上で、
cmakeをジェネレータを指定して実行するとMakefileやプロジェクトファイルなどが生成されるので、それを使ってビルドします。
ジェネレータの一覧は-Gオプションを付けてcmakeを実行すると見られます。
ビルド自動化ツールCMake Part.1
■ このスレッドは過去ログ倉庫に格納されています
1蟻人間 ◆T6xkBnTXz7B0
2021/06/12(土) 20:08:31.78ID:bymgAWyc36蟻人間 ◆T6xkBnTXz7B0
2021/06/16(水) 18:34:48.95ID:Qk2ktN9D >>35
それはよくある間違いで、Win64ではなくx64を指定しないといけないらしい。
https://stackoverflow.com/questions/55708600/whats-the-cmake-generator-for-visual-studio-2019
それはよくある間違いで、Win64ではなくx64を指定しないといけないらしい。
https://stackoverflow.com/questions/55708600/whats-the-cmake-generator-for-visual-studio-2019
昔の教科書で習った make を使うことにしています、内部をしっかり把握しているのでこれが一番いろいろやりやすいのです
https://www.a;mazon.co.jp/dp/4871481689/
https://www.a;mazon.co.jp/dp/4871482006/
https://www.a;mazon.co.jp/dp/4871481689/
https://www.a;mazon.co.jp/dp/4871482006/
38蟻人間 ◆T6xkBnTXz7B0
2021/06/16(水) 19:13:45.91ID:Qk2ktN9D >>35
/MT, /MD, /MTd, /MDdについてだが、CMake 3.15よりMSVC_RUNTIME_LIBRARYという変数が使えるらしい。
https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html
https://stackoverflow.com/a/56490614
ターゲットを分けて、それぞれについて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より前は、ちょっとややこしいコードになる。
/MT, /MD, /MTd, /MDdについてだが、CMake 3.15よりMSVC_RUNTIME_LIBRARYという変数が使えるらしい。
https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html
https://stackoverflow.com/a/56490614
ターゲットを分けて、それぞれについて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より前は、ちょっとややこしいコードになる。
40デフォルトの名無しさん
2021/06/16(水) 19:33:04.22ID:Qk2ktN9D >>38
訂正。
「MultiThreadedDLL$<$<CONFIG:Debug>:Debug>」
じゃなくて
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」。
訂正。
「MultiThreadedDLL$<$<CONFIG:Debug>:Debug>」
じゃなくて
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」。
41蟻人間 ◆T6xkBnTXz7B0
2021/06/16(水) 19:38:16.75ID:Qk2ktN9D 「$<$<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)も付けた方がいいらしい。
デバッグ版のときは"Debug", リリース版のときは空文字列に展開されるらしい。
つまり、
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」
は、デバッグ版では「MultiThreadedDebugDLL」となり、
リリース版では「MultiThreadedDLL」となる。
なお、MSVC_RUNTIME_LIBRARYを使う場合は、
cmake_minimum_required(VERSION 3.15)の後に
cmake_policy(SET CMP0091 NEW)も付けた方がいいらしい。
2021/06/16(水) 20:48:17.12ID:z1aHwQBP
そうすると四種類のビルドをやるにはこうすると出来るけど、
[ --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")
[ --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")
2021/06/16(水) 21:09:31.72ID:z1aHwQBP
うーん、あとこれだと自分で記述する場合はいいけど、
GitHubとかで取ってきたgcc用のtar-ballの移植の場合は
MSVC_RUNTIME_LIBRARYのためのTARGET沢山増設して
CMakeLists.txtが殆ど書き直しに近い状態になるなあ
GitHubとかで取ってきたgcc用のtar-ballの移植の場合は
MSVC_RUNTIME_LIBRARYのためのTARGET沢山増設して
CMakeLists.txtが殆ど書き直しに近い状態になるなあ
44蟻人間 ◆T6xkBnTXz7B0
2021/06/16(水) 21:25:12.16ID:woJNV48Q う〜ん、ターゲットは二種類でいいんじゃないか。generator expressionsでデバッグとリリースの差異を吸収できるし。
結局、IDEでデバッグ・リリース切り替えないといけないっしょ。
結局、IDEでデバッグ・リリース切り替えないといけないっしょ。
2021/06/16(水) 21:27:08.88ID:z1aHwQBP
それって二種類書けば --configのDebug/Releaseで四種類そろうって意味?
46蟻人間 ◆T6xkBnTXz7B0
2021/06/16(水) 21:33:26.89ID:woJNV48Q そうだよ。プロパティに指定したgenerator expressionの
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」は、「MultiThreadedDebugDLL」と
「MultiThreadedDLL」になる。
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」は、「MultiThreadedDebugDLL」と
「MultiThreadedDLL」になる。
47デフォルトの名無しさん
2021/06/16(水) 21:55:08.14ID:XZ06lrte 共通がたくさんあるのであればfunction()〜endfunction()使うのもありじゃない?
https://cmake.org/cmake/help/latest/command/function.html
https://cmake.org/cmake/help/latest/command/function.html
2021/06/16(水) 21:57:56.14ID:z1aHwQBP
そうなるとこれでいいんだ。ありがとう。
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")
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")
2021/06/16(水) 22:01:08.77ID:z1aHwQBP
2021/06/16(水) 22:11:55.13ID:z1aHwQBP
これが正解になるのかな
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")
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")
2021/07/11(日) 15:46:00.11ID:lbKLD5N+
結局こうやって人を実験台にする気満々で初めて誰にも相手にされなくなるんだよね。
メタ系の言語を推すバカの末路だわ。
メタ系の言語を推すバカの末路だわ。
53蟻人間 ◆T6xkBnTXz7B0
2021/07/19(月) 23:06:43.32ID:6UpSDY/2 バーカバーカ
ヘビメタだぜ。奉ろうベイビー!
みんな優秀だから質問しなくてもできる。
偉い偉い。
ヘビメタだぜ。奉ろうベイビー!
みんな優秀だから質問しなくてもできる。
偉い偉い。
54デフォルトの名無しさん
2021/09/14(火) 01:26:01.72ID:Mj50vLs9 広く使われてるけどあんまり話題がないのな
55デフォルトの名無しさん
2021/09/14(火) 06:15:43.87ID:pTMW8GY7 自作自演の即死スレ
2021/09/15(水) 11:48:33.99ID:PYzW5a+n
そもそもマルチOSで出そうなんて苦労の割にメリット低いわ。
それもわからんバカがこういうデラックスなツールを使いたがるんだよね。
それもわからんバカがこういうデラックスなツールを使いたがるんだよね。
2021/09/15(水) 19:05:46.01ID:5Un5Xbsb
VSCodeだけでC++やろうとするとこれが一番楽なんよ。マルチは苦労増えるだけやな
58デフォルトの名無しさん
2021/09/15(水) 23:44:18.94ID:9XE/xHox cmakeってそんなにデラックスかな?
マルチプラットフォームでなくてもmakefile直書きよりメリットあると思うけど
makefile → コンパイルやリンクなど手続きを記述していく
cmake → 手続きではなく関係性などを定義していく
マルチプラットフォームでなくてもmakefile直書きよりメリットあると思うけど
makefile → コンパイルやリンクなど手続きを記述していく
cmake → 手続きではなく関係性などを定義していく
2021/09/16(木) 06:19:41.69ID:QQbmBwad
広く使われることを考えてなかったような設計だよな
なんかいまいち近代的じゃない
なんかいまいち近代的じゃない
2021/09/22(水) 02:27:13.15ID:H7+/Tu0q
>>58
その程度の用途でmakefileも満足に書けないならc/c++での開発なんかするべきじゃない。
その程度の用途でmakefileも満足に書けないならc/c++での開発なんかするべきじゃない。
61デフォルトの名無しさん
2021/09/22(水) 09:37:25.13ID:85DYkwM1 そんなこといったって・・・
プラットフォームごとに使えるコマンドとか違うじゃん
cmakeに関係性を記述して各プラットフォームごとのMakefileは自動生成のほうが楽なんだもん
プラットフォームごとに使えるコマンドとか違うじゃん
cmakeに関係性を記述して各プラットフォームごとのMakefileは自動生成のほうが楽なんだもん
2021/09/22(水) 19:08:29.74ID:xKA5BBWf
大した差ではないし、その差が理解できないやつは問題起きた時に明らかに詰むからやめろや。
63デフォルトの名無しさん
2021/09/22(水) 21:21:13.37ID:85DYkwM1 ごめんね・・
2021/09/22(水) 22:10:24.97ID:fOdtASHT
でも現実には使われてるからな
個別にmakefileなんて書かない
個別にmakefileなんて書かない
65デフォルトの名無しさん
2021/09/23(木) 00:37:14.36ID:1QHTb9H7 便利だと思えば自分で使えば良いだけで他人に強制するものではないんだよ
https://www.tokyo-np.co.jp/article/132305
https://www.tokyo-np.co.jp/article/132305
2021/09/23(木) 10:01:39.72ID:u1LIdCP+
別に強制はしてないから
2021/09/23(木) 11:42:47.93ID:AZNHMrAu
そうやってexcel方眼紙ができていったわけだけれど。
2021/09/25(土) 16:56:31.88ID:wzNzdXVE
>>60
C/C++の開発からこそCMakeLists.txtを書くんだよ
C/C++の開発からこそCMakeLists.txtを書くんだよ
2021/10/04(月) 08:16:59.56ID:S53xZnhz
手元のCのプロジェクトをmakefileからcmakeへ移行したお陰でVSでビルド出来るようになったし、ninjaでもビルド出来るようになって、こっちはビルドが爆速になって良いことしかない
70デフォルトの名無しさん
2021/10/06(水) 17:43:31.95ID:XJEs7oM2 おめ
2021/12/31(金) 11:32:54.51ID:+Lg1Sgs9
configureオプションとcmakeとを対照できる手段あるかな?
ClamAVのビルドツールがcmakeになってしまったので、指定していたconfigureオプションをcmakeに翻訳してやらないとならない。
ClamAVのビルドツールがcmakeになってしまったので、指定していたconfigureオプションをcmakeに翻訳してやらないとならない。
2023/09/21(木) 20:25:44.21ID:QerBhdvC
アレ、なんかすごいことになってるやんか!
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市早苗総理「金利上昇よりも日本の成長が大事」 [Hitzeschleier★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★2 [少考さん★]
- 【速報】 米国政府、中国が日本の自衛隊にレーダーを照射を批判、同事案で中国を批判するのは初めて [お断り★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★2 [Hitzeschleier★]
- 【高市首相】「民主党が提出したから」 議員定数「1割」削減の理由 [ぐれ★]
- 【野球】止まらぬ野球人口減少に危機感 ラミレス氏「野球人口は激減、人気自体も下がっている」「もっと野球ができる環境を整えるべき」 [冬月記者★]
- 【悲報】低収入男性の未婚率、低収入女性に比べて60パーセントも高いことが判明wwwww小野田紀美助けて! [856698234]
- 【高市速報】小泉進次郎「事前に中国軍から飛行訓練を開始すると連絡があったのは事実」★2 [931948549]
- JR東海「リニア工事で水が枯れるのは一瞬だし回復させる手立てないわこれ」 [744361492]
- 【正論】高市さん「『企業献金について与野党で協議する』という答弁は石破個人のものであり、もはや無効」特定野党を完全論破 [519511584]
- 【悲報】たけガイ、「中卒」という言葉を覚えてしまう🏡
- 自作pc時期が悪いおじさん、絶命 [329329848]
