餃子を食べるとき、何をつけますか?

自社製のライブラリを使用してPCゲーム開発をしています。

今回、ゲームにネット接続の機能を持たせることとなりました。
ネットゲーム、というほどのものでもなく、
特典のデータがダウンロードできる、といった程度ですが。

コレのためにFTPダウンロードの仕組みを試作しました。
検証用のコンソールアプリケーションではうまくいったのですが、
いざゲームプログラムに組み込んだところ、

nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) は既に (自社製ライブラリ).lib(Allocator.obj) で定義されています。
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に (自社製ライブラリ)..lib(Allocator.obj) で定義されています。
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) は既に libcpmtd.lib(newaop.obj) で定義されています。
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) は既に LIBCMTD.lib(delete2.obj) で定義されています。
1>C:\Users\New Challenger\PROGRAMING\(開発中).exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

というエラーが発生。

http://support.microsoft.com/kb/148652/ja」 の説明を参考に対処してみたところ、

1>(自社製ライブラリ).lib(Allocator.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) は既に nafxcwd.lib(afxmem.obj) で定義されています。
1>(自社製ライブラリ).lib(Allocator.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に nafxcwd.lib(afxmem.obj) で定義されています。
1>C:\Users\New Challenger\PROGRAMING\(開発中).exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

となってしまうのですね。

ぶつかり合っている両者のうちの、どちらかがなければエラーを避けられるのは確かなんですが、
自社製ライブラリの方のnew/deleteも、アプリケーションの仕組みに合わせて変形させてあるものなので取っ払ってしまうわけにもいかず、、、

何かうまいこと共存させる方法はないものでしょうか?

自社製のライブラリではありますが、
開発者の方が今現在社を離れているためすぐに回答を得られないので、
広く知恵を貸していただきたいのです。

A 回答 (1件)

スマートな方法とはいえませんが


リンカーのオプションで
「/FORCE 未解決または複数定義のシンボルがある場合でも、リンクを強制的に終了します。」
というオプションがあります。
http://msdn.microsoft.com/ja-jp/library/y0zzbyt4 …
nafxcwd.libと(自社製ライブラリ).libの、
リンク順を入れ替えて意図通りのnewが呼ばれるように制御できるかもしれません。
※実際試したわけではないので、できるかどうかはわかりません。

もし(自社製ライブラリ).libを修正できるなら
http://www2.research.att.com/~bs/bs_faq2.html#pl …
が参考になるかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
早速、お教えいただいたことを参考に、いろいろと試してみたいと思います。

本当なら、
「うまくいきました、ありがとう!」
といいたいのですが、
まだちょっと実装と検証に時間がかかってしまいそうなので。

まずはなにより、お答えをいただけたことにお礼申し上げます!

お礼日時:2010/11/10 09:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報