VC PlusPlus:Link Error LINK2019 未解決のシンボル…で参照されました。 対処方法 新しいページはコチラ
提供: yonewiki
(→2.C言語とC++言語の混在による呼び出し関数の互い違い) |
(→2.C言語とC++言語の混在による呼び出し関数の互い違い) |
||
145行: | 145行: | ||
ちなみに | ちなみに | ||
− | + | Sample.h | |
<syntaxhighlight2 lang="cpp"> | <syntaxhighlight2 lang="cpp"> | ||
#ifdef __cplusplus | #ifdef __cplusplus | ||
151行: | 151行: | ||
#endif | #endif | ||
− | void zcalloc(void *,unsigned int,unsigned int); | + | void zcalloc(void * vValue,unsigned int uiValue,unsigned int uiValue2); |
#ifdef __cplusplus | #ifdef __cplusplus | ||
157行: | 157行: | ||
#endif | #endif | ||
<syntaxhighlight2> | <syntaxhighlight2> | ||
+ | |||
+ | のように記述することでC++言語を使っている場合にC言語の関数形式に必ず変更するという定義が出来ます。まぁC言語に対応するとか、割かし難しい場合もあります。 | ||
+ | |||
+ | |||
+ | その場合は、参照するライブラリそのものをC++言語に作り替えるという方法があります。これは流石に面倒です。もう一つは、呼び出している関数を自前で再定義して使うという方法もあります。この場合、C言語で書かれたライブラリのプロジェクトの中にある特定プログラムファイルをSample.cというのをコピーして同じディレクトリにおいて、Sample.cとSample.cppが同じディレクトリに存在する状態になります。Sample.cやSample.cppに変更が発生した場合は両方を修正しなければならなくなります。 | ||
+ | |||
+ | |||
+ | そしてSample.hとSample.cppを自分が開発を進めているプロジェクトに取り込みます。Sample.cppをプロジェクトに追加します。ヘッダファイルはSample.cpp内で#include "Sample.h"となっているなら、プロジェクトのプロパティのC/C++の項目の全般のところにある追加のインクルードファイルパスにSample.hがあるところを相対パスで指定します。必ずセットで移動する仕組みの関係になっていればです。一緒には動かさない。参照するライブラリ群は常に同じなら絶体パスで指定すると良いでしょう。であれば、本来ならばインクルードは#include <Sample.h>のように記述する方法をとるといいのかもしれません。元のファイルとの関係もあるので、あまり変更しない方がいいと思うので、"Sample.h"のような記述でインクルードするもの有りだとは思います。ちなみに<Sample.h>のようになっていれば、プロジェクトのプロパティのVCディレクトリという欄の追加のインクルードの方にパスを記述します。リンカエラーが何が参照できなかったかというヒントは表示されるので名前マングリング処理されたエラーが表示されても冷静に対処できるはずです。名前マングリングがややこしさを増殖させて感じてしまいがちですが、名前マングリングが起こることが分かっていれば、正確に何がどこに無くてエラーなのかっていうのは探知できると思います。 | ||
+ | |||
+ | |||
+ | このような不具合は同じプロジェクト内でlibを参照する場合でも同じです。プロジェクト内で半分引用したりした場合は、それ以外のコードを元々のライブラリを参照するようになっていて、半分引用してプロジェクト内では、Cの規約で呼び出されるように関係性が保たれていて引用したプロジェクトは問題なくビルド出来ます。しかし、そのプロジェクトに依存している中心的役割のプロジェクトからはC++の規約で引用したプロジェクトのlibを参照するようになっていれば、さらに引用元の関数を参照する際に、リンクエラーが発生します。さっきまでうまく行ってたのに依存してる関数だけリンクエラーとか意味わかんねぇっていう気分になります。実にややこしいことです。 | ||
+ | |||
+ | |||
+ | これが、C++とCの混合によるリンクエラーの仕組みです。要するに?なんとかして合わせろ!っていう事しか言えません。しかもC言語をC++言語に書き直したりする道を選んだときは、C言語独自に許された記法もあるので、割かしメンドクサイ変更をしつつ、あたらしく作ったCppファイルをメンテしないと駄目なこともあります。しっかりライブラリの設定をしたのにリンクエラーがでるときは、たぶん、こういう感じのリンクエラーが一番多いと思います。 | ||
[[VC PlusPlus]]に戻る | [[VC PlusPlus]]に戻る |