Linuxで動かしていたMakefileをWindowsでも使えるようにCMake対応したときのメモ
cmakeを実行すると、
Linuxの場合、Makefileが生成され、
Windowの場合、Projectファイルが生成される。
#1.変数の設定を置き換える
- CC = gcc
- CXX = g++
⇑デフォルトコンパイラが自動的に設定されるので削除する
⇓デフォルトコンパイラから変更する場合
+ set(CMAKE_C_COMPILER ◯◯◯ ... )
+ set(CMAKE_CXX_COMPILER ◯◯◯ ... )
- INCDIR=./include
+ set(INCDIR ./include)
正規表現で置換する場合は以下のようにする。
^ ⇒ set(
= ⇒
$ ⇒ )
###文字列を加える
- INCDIR+=/usr/include /usr/local/include
+ set(INCDIR ${INCDIR} /usr/include /usr/local/include)
###パスが違うとき
- HOGE=/usr/local/hoge
+ if(WIN32)
+ set(HOGE C:/Foo/hoge)
+ else()
+ set(HOGE /usr/local/hoge)
+ endif()
###オプション -I ⇒ include_directories()
- -I$(INCDIR)
+ include_directories(${INCDIR})
###オプション -L ⇒ link_directories()
- -L$(LIBDIR)
+ link_directories(${LIBDIR})
###オプション -l ⇒ target_link_libraries()
- -l$(LIBS)
+ target_link_libraries(${PROJECT_NAME} ${LIBS})
add_executableの後に記述する。
###CXXFLAGS = -std=c++11 -Wall
- CXXFLAGS = -std=c++11 -Wall
+ set(CMAKE_CXX_FLAGS -std=c++11 -Wall)
###アスタリスクで複数のファイル指定をする場合
- HEADERS += $(INCDIR)/*.h
+ file(GLOB HEADERS ${INCDIR}/*.h)
#2.ターゲットと実行を置き換える
- HOGE: hoge.o
+ add_executable(HOGE hoge.cpp)
※オブジェクトファイル関連は削除します。
ここまでやったら、とりあえずビルドしてエラーログに従う。
##ビルドコマンド
###Linux
$ mkdir build
$ cd build
$ cmake ..
$ make
###Windows
> mkdir build
> cd build
> cmake ..
> cmake --build . --target ALL_BUILD --config Release -- /nologo /verbosity:minimal
Visual Studioのバージョンを指定する場合
cmake -G"Visual Studio 14" ..
ビルド番号 | 年式 |
---|---|
Visual Studio 12 | 2013 |
Visual Studio 14 | 2015 |
Visual Studio 15 | 2017 |
Visual Studio 16 | 2019 |
##エラー解消
###デバッグの基本
変数の中身表示する
message("HOGE" ${HOGE})
##記法を修正
Parse error. Expected "(", got newline with text
- $(変数名)
+ ${変数名}
ファイルが見つからない
Cannot find source file
- ./
+ ${PROJECT_SOURCE_DIR}/
現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐ ために、ファイルを Unicode 形式で保存してください。
ソースコードをutf-8として読み込ませるために追加。
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
LINK : fatal error LNK1104: ファイル〇〇〇.libを開くことができません。
##適切なパスを指定
target_link_libraries(△△△ 〇〇〇.lib)
を追加。△△△はターゲットファイル名。
なお、ライブラリディレクトリはtarget_link_directoriesではなく、
link_directories()
で追加することができる。
##リンクエラーを修正
error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MD_DynamicRelease の値
↑長々と上記のエラーが表示される場合は
if(MSVC)
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_MINSIZEREL ${CMAKE_C_FLAGS_MINSIZEREL})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_MINSIZEREL ${CMAKE_CXX_FLAGS_MINSIZEREL})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
endif(MSVC)
を最上位のCMakeLists.txtへ追加する。