日記

内容の正しさは保証しません

ノート 18/5/3-6/3

DLL関連が2つ、あとwxWidgets、それと1つ未解決の問題

1. エントリポイントが見つかりません
前回作成したhelloを何気なく-o hello.exeとしてビルド、ダブルクリックで実行しようとしたら「エントリポイントが見つかりません」。
原因は同名DLLが衝突しているせい。

対処法
(1)ldd ./hello.exeで共有ライブラリを確認し、system32以外(mingw/binなど)の場所にあるものを見つける
(2)システム環境変数の編集からシステム環境変数のpathを見る
(3)pathの中身を1つ1つ確認し、衝突しているDLLを見つける
(4)pathを編集して先に読み込みたい方のDLLがあるパスを衝突している方より上に書く
もしくはパスから削除

参照
MinGWでHelloWorld(Gtkmm3版)に成功した - やってみる

あるいは、DLLを実行ファイルと同じディレクトリに置いて実行できるのを確認し、衝突していると思うDLLを除いて再びエントリポイントが見つかりませんと怒られることでも問題のライブラリを発見できる。

2.静的リンク
libstdc++を静的リンクしようとするとlinker command faild with exit code 1.またlibgccの場合は無視されているようで、lddで確認すると普通にlibgcc xxxx.dllが見える。素直に諦めるが吉

3. XRC
wxWidgetsで部品とコードを分離するために使う。wxFormBuilderがインストールも使い方も簡単でいい感じだった。wxGladeも使おうとしたけどwxPythonをインストールするまでの道のりが長くて諦めた。

参考
Tips of wxWidgets. - Luoyang Press

4. テンプレート関数の引数にconst参照があるとlinker command faild with exit code 1.
picojsonはコードが冗長だからjson11を使っていたのだが、こちらもパースの処理が長くなって良くない。結局簡単にするための関数を書くことにした。

template <class T> T& get(T&, const json11::Json&);

template <> bool& get<bool>(bool& b, const json11::Json& j) { return b = j.bool_value(); }
 `json11::Json::bool_value() const' ▒ɑ΂▒▒▒▒`▒▒▒▒Ă▒▒Ȃ▒▒Q▒Ƃł▒
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

何言ってるか分からないけど、とにかくエラー。g++使うと

undefined reference to `json11::Json::bool_value() const'
collect2.exe: error: ld returned 1 exit status

多分json11::Json::bool_value()が未定義という意味だった。(そのまま)
原因は見当もつかない。とりあえずコードを参考というかパクった元のを真似てstatic inlineをつけたらclang++では直った。g++では直らない。
頭からすっかり抜けていたんだけど、json11はヘッダだけではなかった。近年稀に見る間抜け。

template <class T>
static inline T& get(T&, const json11::Json&);

template <>
inline bool& get<bool>(bool& b, const json11::Json& j) { return b = j.bool_value(); }