ビルド時にリンクエラーが発生してしまいます。どのように対処すればよいのかわかりません。
わかる方教えてください。
xxxxx.obj : error LNK2001: 外部シンボル "char const * const _afxPchNil (?
_afxPchNil@@3PBDB) は未解決です
DEBUGモードでは問題なくビルドできるのですが、Releaseモードだと上のリンクエラーが
発生してしまいます。
プログラムはwin32 console Appです。
データベースにアクセスする関数を(共有DLLでMFC使用にて)LIBファイルに作成し
親のプログラム(MFCは使用しない)はそのLIBファイルを「プロジェクトの設定」
の「リンク」のライブラリモジュールに登録して使っています。
データベースアクセス関数は問題なくビルド(Releaseモード)できています。
いろいろ調べた結果、プリプロセッサ定義に定義されている_AFXDLLが原因ではないかと
見ているのですが、どうにもこうにもわかりません。
親のプログラムは「MFCは使用しない」としているので_AFXDLLの定義は無いのですが、
データベースアクセス関数は「共有DLLでMFC使用」としているので、_AFXDLLの定義は
必要です。これをとると、今度はデータベースアクセス関数のビルドがうまくいきません。
なら、データベースアクセス関数を「MFCスタティックライブラリ使用」でビルドしてみた
のですが、これでもうまくいきません。いろいろな(考えられる限り)パターンを試した
のですが、だめでした。
ここの過去ログを調べ同じようなエラーの対処方法を真似たのですがこれも全て空振りに
終わってしまいました。
他のHPで調べたりといろいろ手は尽くしたのですが、もう手詰まり状態です。
長い文になってしまって申し訳ないです。
どなたか、お分かりでしたら、助けてください。
長文な割にさっぱり状況がつかめませんが、とりあえず MFC ソースは見ましたか?
mfc/src/strcore.cpp 中にて _afxPchNil は定義されています。
mfc/include/afx.inl mfc/include/afx.h でこれを使っています。
ライブラリ側で MFC を使っているなら、アプリケーション側でも MFC を使うよう
設定するべきかと思うのですがいかがでしょうか。
AfxWinInit の説明など参照。
とりあえず、解決したらマルチポスト先にもきちんと後始末して下さいね。
なお、私自身はMFC使用していないので該当するエラーの回避方法は不明です。
DEBUGでリンクが通るのであればRELEASEで
必要なライブラリをリンクしていないんじゃないだろうかとか思いますが。
http://n76cd-01p05.ppp11.odn.ad.jp/cgi.cgi?08750
afx.h もインクしています。
とりあえず親のプログラムも「共有DLLでMFC使用」でやってみましたが、これもだめでした。
今度は下記のリンクエラーが発生します。
LINK : warning LNK4049: ローカル定義のシンボル _fclose がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル __sys_errlist がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル _fopen がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル _sprintf がインポートされました
xxxxx.obj : error LNK2001: 外部シンボル __imp__fputs は未解決です
xxxxx.obj : error LNK2001: 外部シンボル __imp___errno は未解決です
Release/xxxxx.exe : fatal error LNK1120: 外部参照 2 が未解決です。
link.exe の実行エラー
解決しました。
まず今作っているツールの構成は
親プログラム、データベース関数はC++にて作成。
メッセージ出力関数がCにて作成しています。
が、この構成がいろいろな問題を引き起こしたようです。
※複数人で作成しているためこうなってしまった。
最初の問題は、やはりtetrapodさんからご指摘いただいた、
「ライブラリ側で MFC を使っているなら、アプリケーション側でも MFC を使うよう
設定するべきかと思うのですがいかがでしょうか。」
まさしく、その通りでした。
もうひとつは、メッセージ出力関数がCで作成しているための問題があります。
この関数内でシステムからのエラー情報を取得してメッセージに出力を行っている
のですが、今回のように、C/C++混在かつMFCを使用している場合には、
Cで作成した関数ではシステムからエラー情報を取得できない。
(リンクするLIBが違うため?)
解決策として、メッセージ出力関数もC++で作り直しました。
※最初からC++で作れといわれそうですが・・・(複数人で作っているため
C/C++混在となってしまったのです)