VC PlusPlus:Link Error LINK2019 未解決のシンボル…で参照されました。 対処方法 新しいページはコチラ
提供: yonewiki
(→2.C言語とC++言語の混在による呼び出し関数の互い違い) |
(→知っていた方が良い小技) |
||
49行: | 49行: | ||
以下のようなコマンドを打つと生成できます。必ずしも出力できるわけではありません。dllを生成したプログラム側で__declspec(dllexport)というような宣言をしてあるものに限ります。 | 以下のようなコマンドを打つと生成できます。必ずしも出力できるわけではありません。dllを生成したプログラム側で__declspec(dllexport)というような宣言をしてあるものに限ります。 | ||
+ | |||
+ | defファイルの中身は自動で適切に生成されることもありますが、以下のような形式に整理しないといけない場合もあります。 | ||
+ | |||
+ | 以下はwintab32.dllっていうファイルから作ったdefファイルの抜粋です。 | ||
+ | <syntaxhighlight2 lang="text"> | ||
+ | Dump of file wintab32.dll | ||
+ | |||
+ | File Type: DLL | ||
+ | |||
+ | Section contains the following exports for Wintab32.dll | ||
+ | |||
+ | 00000000 characteristics | ||
+ | 59BBE69A time date stamp Fri Sep 15 23:41:30 2017 | ||
+ | 0.00 version | ||
+ | 20 ordinal base | ||
+ | 1184 number of functions | ||
+ | 54 number of names | ||
+ | |||
+ | ordinal hint RVA name | ||
+ | |||
+ | 25 0 000079E1 Sync | ||
+ | 22 1 00006235 WTClose | ||
+ | 60 2 000089CC WTConfig | ||
+ | 81 3 000033C3 WTDataGet | ||
+ | (省略) | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | というように吐き出された時のname欄が関数名でSyncとかWTCloseってのがソレにあたる。関数名には@が入ったりもします。 | ||
+ | |||
+ | <syntaxhighlight2 lang="text"> | ||
+ | LIBRARY (ファイル名(拡張子を省く)) | ||
+ | EXPORTS | ||
+ | (関数名) | ||
+ | (関数名) | ||
+ | (関数名) | ||
+ | (関数名) | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | コマンドは | ||
<syntaxhighlight2 lang="bash"> | <syntaxhighlight2 lang="bash"> | ||
dumpbin.exe /EXPORT (DLLライブラリファイル名or(完全パスor相対パス)\DLLライブラリファイル名) > (ライブラリ名と同じ名前).def | dumpbin.exe /EXPORT (DLLライブラリファイル名or(完全パスor相対パス)\DLLライブラリファイル名) > (ライブラリ名と同じ名前).def | ||
123行: | 162行: | ||
− | かなり、わけわからん@@とかYXPAとかどっから来たん?ってなると思います。そもそもマングリングってなんかヤラシイ名前で恥ずかしい(Embarrass) | + | かなり、わけわからん@@とかYXPAとかどっから来たん?ってなると思います。そもそもマングリングってなんかヤラシイ名前で恥ずかしい(Embarrass)わ。とか言っている日本人のなんと多いことか。そうです。チコちゃんはマングリングが何なのかしっています。 |
129行: | 168行: | ||
− | 装飾。英語のmanglingは日本語で修飾という意味です。マングリ返しとは関係ないし、ペロペロしたりもしません。チコちゃんは5歳なのにC++ | + | 装飾。英語のmanglingは日本語で修飾という意味です。マングリ返しとは関係ないし、ペロペロしたりもしません。チコちゃんは5歳なのにC++のマングリングまで知っているなんて、マングリ返しでもされたことをあるのかなぁ?「ませてはいませんて」そうなんです。C++では同一の関数名を名前空間を変更することによって定義できます。namespase ですね。だったり、オーバーロードという多重定義によって、引数が違うだけの関数名との切り分けも考慮した命名規則があります。命名規則は別の場所で解説するとして、元の名前がきちんとわかるようにわかりにくく修飾されています。元の名前は以下のようなundnameコマンドで確認できます。 |
<syntaxhighlight2 lang="text"> | <syntaxhighlight2 lang="text"> |