あかすくぱるふぇ

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

2017年02月

・主なディレクトリ
/root : ルートユーザーのみがアクセスできる。
/home/username : ユーザーのホームディレクトリ。各ユーザーが自由にアクセスできる。
/opt : 共有ソフトはこのフォルダにsudoでインストールする。

・root権限
suコマンドで一般ユーザーにroot権限を与えられるが、これを許してはいけない。
root権限が必要な処理を行う場合は、sudoコマンドで一時的にroot権限を与えるようにする。
sudoコマンドは、rootパスワードでなく、ユーザー自身のパスワードで実行できる。
また、コマンドごとにsudo実行できるか設定することができる。

・apt-get, yum
apt-getやyumでインストールする場合、自動でインストール先を決めてくれる。
一般ユーザーがインストール先を気にする必要はない。

・共有ライブラリ
dllファイルではなく、soファイル。
"g++ -fPIC -shared -o libhoge.so hoge.cpp"というように作成する。
"g++ -L./ -o hoge main.cpp -lhoge"というようにリンクする。
"export LD_LIBRARY_PATH=./"というように共有ライブラリへのパスを通す。
"ldd hoge"というように必要なライブラリを確認する。grepで"not found"を抽出すると便利。

・対象ソリューション
ソリューション名: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

以上です。

↑このページのトップヘ