LoginSignup
7
6

More than 1 year has passed since last update.

MakefileからCMakeLists.txtへ移植メモ

Last updated at Posted at 2021-03-31

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

Terminal
$ mkdir build
$ cd build
$ cmake ..
$ make

Windows

Powershell
> 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へ追加する。

参考

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6