あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

・対象ソリューション
ソリューション名:hogeSln
プロジェクト
hogeLibProj : hoge/hoge.h, hoge/hoge.cppから成る。hogeLibというlibファイルを出力する。
exeProj : exe/exe.cppから成る。hogeLibをリンクして、exeProcという実行ファイルを出力する。

・CMakeLists.txt
project (hogeSln)
add_executable (exeProc exe/exe.cpp)
target_link_libraries (exeProc hogeLib)
add_library (hogeLib hoge/hoge.h hoge/hoge.cpp)

「Windows+VisualStudioで開発してるけど、Linuxでも実行したいし、うまくいかなければEclipse+CDTでデバッグしたい。とはいえ、VisualStudio用のファイルとEclipse用のファイルの両方を用意するのは面倒」

そんな場合にCMakeを使って、ソースファイルを共通化する方法を紹介します。

例として、main.cpp, hoge.h, hoge.cppの3つのファイルから成るプロジェクトを取り上げます。
hoge.hで宣言、hoge.cppで定義されている関数を、main.cpp内のmain関数で呼ぶ想定です。

・CMakeの使い方
CMakeの使い方については、以下のページがわかりやすいです。
http://www.wakayama-u.ac.jp/~chen/cmake/cmakecxx.html

今回の例では、CMakeLists.txtに最低限以下の記述をするだけで大丈夫です。
add_executable (hoge main.cpp hoge.h hoge.cpp)

・Windows+VisualStudio
上記ページの通りに実行するだけです。

・Linux+Eclipse
デバッグ実行できるよう、以下のオプションでcmakeを実行します。
cmake -DCMAKE_BUILD_TYPE=Debug ./
その後、Eclipseで以下のようにプロジェクトをインポートします。

新規→C/C++→Makefile Project with Existing Code→次へ
Existing Code Locationに、コードとMakefileのあるフォルダを指定→完了

なお、CMakeLists.txtが無くて、(他人が作った)Makefileだけがある場合は、
CMakeCache.txtのCMAKE_BUILD_TYPE:STRING=の後にDEGUGと記入すれば
デバッグビルドできるっぽいです。

これでビルド・実行・デバッグができるはずです。
以上です。

exeから呼び出す関数には、__declspec(dllexport)をつける。
ただし、defファイルを使えば__declspec(dllexport)の記述を省略できる。

名前装飾を無効化するために、extern "C"もつける。

DLLのリンクには、明示的リンクと暗黙的リンクとがある。
明示的リンクは、LoadLibrary()などで実現する。
暗黙的リンクは、関数宣言に、__declspec(import)をつけ、コンパイル時にlibファイルをリンクすることで実現する。

暗黙的リンクで利用するヘッダファイルは、
#ifdef MYDLL
#define DLLAPI extern "C" __declspec(dllexport)
#else
#define DLLAPI extern "C" __declspec(dllimport)
#endif
などとしておくと、DLL側とEXE側で共用できる。

以下は参考ページ。
http://exlight.net/devel/windows/dll/windll.html
http://akasuku.blog.jp/archives/43379993.html
http://fa11enprince.hatenablog.com/entry/2014/06/20/015808

以上です。

↑このページのトップヘ