- 1 名前:蟻人間 mailto:sage [2021/06/12(土) 20:08:31.78 ID:bymgAWyc.net]
- CMakeは、コンパイラに依存しないビルド自動化のためのフリーソフトウェアです。主にC/C++のビルド管理で使用され、様々なビルド環境に対応しています。Windows、Linux、MacどこでもOK。
https://cmake.org/ 基本的な使い方はまず、ビルド環境にCMakeをインストールした後で、ビルド方法を記述したテキストファイルCMakeList.txtをソースと同じ場所に作成した上で、 cmakeをジェネレータを指定して実行するとMakefileやプロジェクトファイルなどが生成されるので、それを使ってビルドします。 ジェネレータの一覧は-Gオプションを付けてcmakeを実行すると見られます。
- 21 名前:デフォルトの名無しさん mailto:sage [2021/06/13(日) 13:16:26.94 ID:cRYSJGQ8.net]
- CMakeのプロジェクトのなかで変数一覧が記載されたファイルとかないの?
- 22 名前:蟻人間 mailto:sage [2021/06/13(日) 13:59:51.46 ID:grfIiy8/.net]
- >>21
cmakeに成功すると、CMakeCache.txtというファイルができる。 この中に変数の設定内容が一時的に保存されている。
- 23 名前:蟻人間 mailto:sage [2021/06/13(日) 15:30:14.97 ID:otNLJkw4.net]
- 間違えずに書く自信のある人なら、CMakeCache.txtに書かれてる内容を直接書き換えてもいい。
- 24 名前:デフォルトの名無しさん [2021/06/14(月) 10:48:01.94 ID:LnG83xz5.net]
- >>17
蟻は調べながら受け売りコピペしてるだけ 結局自分で調べた方が早い
- 25 名前:デフォルトの名無しさん [2021/06/14(月) 13:15:02.79 ID:shEIUH7U.net]
- 調べて載せてくれてるならいいじゃないのコピペだって
多少の間違いは周りが訂正してあげれば十分 そんな叩いてばかりしてたらコミュニティが過疎っしまいますよ
- 26 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 16:44:53.08 ID:xr9L9qN8.net]
- そんなクソコミュニティ、元々いらんのだが。
- 27 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 18:27:19.15 ID:6p9bp5Dj.net]
- 糞コミュニティなんていくらでもあるんだから、自分に必要ないと思ったら
寄っていかなきゃいいだけ。
- 28 名前:デフォルトの名無しさん [2021/06/14(月) 18:53:14.11 ID:U7CM/gao.net]
- Part 1とか付けると2まで伸びないというジンクスがある。
- 29 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 01:22:59.73 ID:cmWMd34J.net]
- いつも思うことだがツールチェインとか特に
便利にしようと思って作ったのは気持ち的にはわからんでもないけど かえって手間が増えてんだよねえ・・ 移植作業が必要だのなんだのいっても普通にMakefileでいいわってなる たいした手間じゃないしな 他の奴らも全てに精通してるわけじゃないし
- 30 名前:デフォルトの名無しさん [2021/06/15(火) 15:30:47.00 ID:dTl1pSLY.net]
- cmakeスレも昔いくつかあったな
- 31 名前:デフォルトの名無しさん [2021/06/15(火) 18:46:08.38 ID:jlLB8m57.net]
- >>29
いや全然違う。
- 32 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 20:08:19.27 ID:BeYGJoYp.net]
- makefileが方言ありすぎてCMake使うようになったってきいた
- 33 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 20:23:44.43 ID:ULdPzagS.net]
- makeに余計なこと書きすぎなのがいけない。酷いのになるとコロンの右側にstdio.hがあったりする。gcc -Mの出力をそのまんま喰わせてる感じ
- 34 名前:デフォルトの名無しさん [2021/06/15(火) 23:41:38.62 ID:0F6z4l8H.net]
- cmakeは宣言型、makefileは手続型みたいな感じかな
makefileはコマンドやシェルスクリプトを使って何でもできちゃうから他人には読めないようなものになってることがある
- 35 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 18:27:05.85 ID: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 名前:蟻人間 mailto:sage [2021/06/16(水) 18:34:48.95 ID:Qk2ktN9D.net]
- >>35
それはよくある間違いで、Win64ではなくx64を指定しないといけないらしい。 https://stackoverflow.com/questions/55708600/whats-the-cmake-generator-for-visual-studio-2019
- 37 名前: mailto:sage [2021/06/16(水) 19:13:04.42 ID:ujIwgEeO.net]
- 昔の教科書で習った make を使うことにしています、内部をしっかり把握しているのでこれが一番いろいろやりやすいのです
https://www.amazon.co.jp/dp/4871481689/ https://www.amazon.co.jp/dp/4871482006/
- 38 名前:蟻人間 mailto:sage [2021/06/16(水) 19:13:45.91 ID:Qk2ktN9D.net]
- >>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より前は、ちょっとややこしいコードになる。
- 39 名前:蟻人間 mailto:sage [2021/06/16(水) 19:17:12.23 ID:Qk2ktN9D.net]
- >>38
訂正。変数じゃなくてプロパティ。
- 40 名前:デフォルトの名無しさん [2021/06/16(水) 19:33:04.22 ID:Qk2ktN9D.net]
- >>38
訂正。 「MultiThreadedDLL$<$<CONFIG:Debug>:Debug>」 じゃなくて 「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」。
- 41 名前:蟻人間 mailto:sage [2021/06/16(水) 19:38:16.75 ID: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 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 20:48:17.12 ID: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 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 21:09:31.72 ID:z1aHwQBP.net]
- うーん、あとこれだと自分で記述する場合はいいけど、
GitHubとかで取ってきたgcc用のtar-ballの移植の場合は MSVC_RUNTIME_LIBRARYのためのTARGET沢山増設して CMakeLists.txtが殆ど書き直しに近い状態になるなあ
- 44 名前:蟻人間 mailto:sage [2021/06/16(水) 21:25:12.16 ID:woJNV48Q.net]
- う〜ん、ターゲットは二種類でいいんじゃないか。generator expressionsでデバッグとリリースの差異を吸収できるし。
結局、IDEでデバッグ・リリース切り替えないといけないっしょ。
- 45 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 21:27:08.88 ID:z1aHwQBP.net]
- それって二種類書けば --configのDebug/Releaseで四種類そろうって意味?
- 46 名前:蟻人間 mailto:sage [2021/06/16(水) 21:33:26.89 ID:woJNV48Q.net]
- そうだよ。プロパティに指定したgenerator expressionの
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」は、「MultiThreadedDebugDLL」と 「MultiThreadedDLL」になる。
- 47 名前:デフォルトの名無しさん [2021/06/16(水) 21:55:08.14 ID:XZ06lrte.net]
- 共通がたくさんあるのであればfunction()〜endfunction()使うのもありじゃない?
https://cmake.org/cmake/help/latest/command/function.html
- 48 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 21:57:56.14 ID: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 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 22:01:08.77 ID:z1aHwQBP.net]
- >>47
ありだと思う
- 50 名前:蟻人間 mailto:sage [2021/06/16(水) 22:07:10.07 ID:woJNV48Q.net]
- >>48
「DLL」は後ろにつけて。
- 51 名前:デフォルトの名無しさん mailto:sage [2021/06/16(水) 22:11:55.13 ID: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 名前:デフォルトの名無しさん mailto:sage [2021/07/11(日) 15:46:00.11 ID:lbKLD5N+.net]
- 結局こうやって人を実験台にする気満々で初めて誰にも相手にされなくなるんだよね。
メタ系の言語を推すバカの末路だわ。
- 53 名前:蟻人間 mailto:sage [2021/07/19(月) 23:06:43.32 ID:6UpSDY/2.net]
- バーカバーカ
ヘビメタだぜ。奉ろうベイビー! みんな優秀だから質問しなくてもできる。 偉い偉い。
- 54 名前:デフォルトの名無しさん [2021/09/14(火) 01:26:01.72 ID:Mj50vLs9.net]
- 広く使われてるけどあんまり話題がないのな
- 55 名前:デフォルトの名無しさん [2021/09/14(火) 06:15:43.87 ID:pTMW8GY7.net]
- 自作自演の即死スレ
- 56 名前:デフォルトの名無しさん mailto:sage [2021/09/15(水) 11:48:33.99 ID:PYzW5a+n.net]
- そもそもマルチOSで出そうなんて苦労の割にメリット低いわ。
それもわからんバカがこういうデラックスなツールを使いたがるんだよね。
- 57 名前:デフォルトの名無しさん mailto:sage [2021/09/15(水) 19:05:46.01 ID:5Un5Xbsb.net]
- VSCodeだけでC++やろうとするとこれが一番楽なんよ。マルチは苦労増えるだけやな
- 58 名前:デフォルトの名無しさん [2021/09/15(水) 23:44:18.94 ID:9XE/xHox.net]
- cmakeってそんなにデラックスかな?
マルチプラットフォームでなくてもmakefile直書きよりメリットあると思うけど makefile → コンパイルやリンクなど手続きを記述していく cmake → 手続きではなく関係性などを定義していく
- 59 名前:デフォルトの名無しさん mailto:sage [2021/09/16(木) 06:19:41.69 ID:QQbmBwad.net]
- 広く使われることを考えてなかったような設計だよな
なんかいまいち近代的じゃない
- 60 名前:デフォルトの名無しさん mailto:sage [2021/09/22(水) 02:27:13.15 ID:H7+/Tu0q.net]
- >>58
その程度の用途でmakefileも満足に書けないならc/c++での開発なんかするべきじゃない。
- 61 名前:デフォルトの名無しさん [2021/09/22(水) 09:37:25.13 ID:85DYkwM1.net]
- そんなこといったって・・・
プラットフォームごとに使えるコマンドとか違うじゃん cmakeに関係性を記述して各プラットフォームごとのMakefileは自動生成のほうが楽なんだもん
- 62 名前:デフォルトの名無しさん mailto:sage [2021/09/22(水) 19:08:29.74 ID:xKA5BBWf.net]
- 大した差ではないし、その差が理解できないやつは問題起きた時に明らかに詰むからやめろや。
- 63 名前:デフォルトの名無しさん [2021/09/22(水) 21:21:13.37 ID:85DYkwM1.net]
- ごめんね・・
- 64 名前:デフォルトの名無しさん mailto:sage [2021/09/22(水) 22:10:24.97 ID:fOdtASHT.net]
- でも現実には使われてるからな
個別にmakefileなんて書かない
- 65 名前:デフォルトの名無しさん [2021/09/23(木) 00:37:14.36 ID:1QHTb9H7.net]
- 便利だと思えば自分で使えば良いだけで他人に強制するものではないんだよ
https://www.tokyo-np.co.jp/article/132305
- 66 名前:デフォルトの名無しさん mailto:sage [2021/09/23(木) 10:01:39.72 ID:u1LIdCP+.net]
- 別に強制はしてないから
- 67 名前:デフォルトの名無しさん mailto:sage [2021/09/23(木) 11:42:47.93 ID:AZNHMrAu.net]
- そうやってexcel方眼紙ができていったわけだけれど。
- 68 名前:デフォルトの名無しさん mailto:sage [2021/09/25(土) 16:56:31.88 ID:wzNzdXVE.net]
- >>60
C/C++の開発からこそCMakeLists.txtを書くんだよ
- 69 名前:デフォルトの名無しさん mailto:sage [2021/10/04(月) 08:16:59.56 ID:S53xZnhz.net]
- 手元のCのプロジェクトをmakefileからcmakeへ移行したお陰でVSでビルド出来るようになったし、ninjaでもビルド出来るようになって、こっちはビルドが爆速になって良いことしかない
- 70 名前:デフォルトの名無しさん [2021/10/06(水) 17:43:31.95 ID:XJEs7oM2.net]
- おめ
- 71 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 11:32:54.51 ID:+Lg1Sgs9.net]
- configureオプションとcmakeとを対照できる手段あるかな?
ClamAVのビルドツールがcmakeになってしまったので、指定していたconfigureオプションをcmakeに翻訳してやらないとならない。
- 72 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 20:25:44.21 ID:QerBhdvC.net]
- アレ、なんかすごいことになってるやんか!
- 73 名前:過去ログ ★ [[過去ログ]]
- ■ このスレッドは過去ログ倉庫に格納されています
|

|