operator new が再定義されています

このQ&Aのポイント
  • 自社製のライブラリを使用してPCゲーム開発をしています。ゲームにネット接続の機能を持たせるためにFTPダウンロードの仕組みを試作しました。
  • しかし、ゲームプログラムに組み込む際に「error LNK2005: void * __cdecl operator new(unsigned int) は既に (自社製ライブラリ).lib で定義されています。」というエラーが発生しました。
  • 自社製ライブラリとnafxcwd.libとの間で衝突が発生しているため、どちらかを削除することはできず、共存させる方法はないか悩んでいます。開発者が不在のため、質問をして解決策を探しています。
回答を見る
  • ベストアンサー

operator new が再定義されています

自社製のライブラリを使用して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も、アプリケーションの仕組みに合わせて変形させてあるものなので取っ払ってしまうわけにもいかず、、、 何かうまいこと共存させる方法はないものでしょうか? 自社製のライブラリではありますが、 開発者の方が今現在社を離れているためすぐに回答を得られないので、 広く知恵を貸していただきたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

スマートな方法とはいえませんが リンカーのオプションで 「/FORCE 未解決または複数定義のシンボルがある場合でも、リンクを強制的に終了します。」 というオプションがあります。 http://msdn.microsoft.com/ja-jp/library/y0zzbyt4(v=VS.80).aspx nafxcwd.libと(自社製ライブラリ).libの、 リンク順を入れ替えて意図通りのnewが呼ばれるように制御できるかもしれません。 ※実際試したわけではないので、できるかどうかはわかりません。 もし(自社製ライブラリ).libを修正できるなら http://www2.research.att.com/~bs/bs_faq2.html#placement-delete が参考になるかもしれません。

fillet_o_fish
質問者

お礼

回答ありがとうございます。 早速、お教えいただいたことを参考に、いろいろと試してみたいと思います。 本当なら、 「うまくいきました、ありがとう!」 といいたいのですが、 まだちょっと実装と検証に時間がかかってしまいそうなので。 まずはなにより、お答えをいただけたことにお礼申し上げます!

関連するQ&A

  • エラーが外れません!深刻な問題 たすけてください!

    クラスで3DCGを表示するプログラムの授業をしています。 私も先生の指示に従って入力しているのですが、 どうしてもエラーが外れないのです。 ということは私の入力ミス? と思えば、エラーが発生しなかった友達から中身を丸ごと入れ替えてもエラーは外れないのです。 なぜ、みんなは正常に起動して私はエラーが発生するのか? これでは授業に遅れを生じ最後には成績にも響く大問題となりかねません! まだ、3DCGの授業は始まったばかりだから遅れを取り戻せます。 正常に戻すなら今のうちです。 なお、2DCGのゲームを作成したときはみんなと変わらず問題なく起動しました。 以下がどうしても取れないエラーです。 これは文法エラーじゃないようです。 LINK : warning LNK4075: /EDITANDCONTINUE は /INCREMENTAL:NO の指定によって無視されます。 nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) は既に LIBCD.lib(new.obj) で定義されています。 nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に LIBCD.lib(dbgdel.obj) で定義されています。 .\Debug/NmBase4.exe : fatal error LNK1120: 外部参照 2 が未解決です。 そのほかです。ほかのエラーは補足で言います。 私の使っているコンパイラは Visual Studio .NET 2003 みんなは Visual Studio 6.0 だそうです。 どうかたすけてください!お願いします!

  • VC++でのリンクエラー [error LNK2005]

    VC++でMFCを使用してダイアログベースのEXEを 作成しています。 以下のクラスのメンバ関数などを使用して、色の操作をしています。 CDC::SetBkColor() CDC::SetTextColor() ビルド時、以下のリンクエラーとなりました。 ---------------------------------------------- nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) はすでに LIBCMT.lib(delete.obj) で 定義されています Release/MenueTest.exe : fatal error LNK1169: 1 つ 以上の複数回定義されているシンボルが見つかりました link.exe の実行エラー ---------------------------------------------- MFC と C(?)のライブラリで delete()関数が競合しているようですが、これを回避する方法をご存知の方、ご教授願います。 <環境> OS:Windows2000 VC++6.0 <備考> リンクエラーになるのは以下の組み合わせです。 「MFCをスタティックリンクする+リリース版」 MFCをスタティックリンクしてもデバッグ版のビルドだとエラーになりません。 また、MFCをスタティックリンクしない場合もエラーにはなりません。 ただし、リンクエラーにならなかった場合、どちらのオブジェクトの delete()関数が呼ばれるか不明で、それが正しいのかも心配です。

  • .exeファイルが開けません

    Visual C++ 2005 Express Editionを使用しています プログラムをコンパイルしてそのEXEファイルを友達に渡したんですが このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。 アプリケーションを再度インストールす事により問題が解決する場合があります。 と言うエラーが出るらしく実行できません 調べてみたらランタイムライブラリをマルチスレッド(/MT)にすると直るということはわかったんですが マルチスレッド(/MT)にするとエラーが出てしまいます main.obj : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) は既に msvcprtd.lib(MSVCP80D.dll) で定義されています。 LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。。 libcpmtd.lib(cin.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__malloc_dbg" は未解決です。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。 C:\C++\計算\Debug\計算.exe : fatal error LNK1120: 外部参照 4 が未解決です。 エラーは文字数の関係で大幅に削ってあります 作成したプログラムも上げておきます http://www.uploda.net/cgi/uploader4/index.php?file_id=0000008742.exe よろしくお願いします

  • C++STLについての質問です。

    C++STLについての質問です。 Visual C++ 2008 Express Edition を使用してDirectXアプリケーションを 作成しています。 その折、std::listテンプレートを使用する機会があったのですが、このリストを 使用しますと、 リンクしています... LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 fatal error LNK1120: 外部参照 3 が未解決です。 とのエラーが吐かれます。 ネットで検索すると、ソリューション構成をDebugからReleaseにすれば良いとの記述が ありましたので、実行してみました。しかし、 リンクしています... error LNK2001: 外部シンボル "_D3DXCreateTextureFromFileExW@56" は未解決です。 error LNK2001: 外部シンボル "_D3DXCreateSprite@8" は未解決です。 error LNK2001: 外部シンボル "_D3DXGetImageInfoFromFileW@8" は未解決です。 error LNK2001: 外部シンボル "_Direct3DCreate9@4" は未解決です。 fatal error LNK1120: 外部参照 4 が未解決です とのエラーが吐かれてしまいました。 尚、コード生成モードは、マルチスレッド(/MT)で作成しています。 どなたか、この問題を解決する方法をご存知ないでしょうか? よろしくお願いします。

  • 多重定義が起きている?--lnk2005エラー:VC++

    今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。 ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。 -------define.h---------- ・・・・(module.h内の関数に使われる型の定義など) --------------------------- -------module.h---------- #include "define.h" void mod_1(void){・・・} void mod_2(void){・・・} --------------------------- このように、2つのヘッダーファイルがあり、define.hをインクルードしてmodule.hを使うという構造です。 (一般的ではないようですが、module.h内にmod_1やmod_2の実体を書き込んでいます。) その中で、以下のようなcppソースファイルがあります。 -------Main.cpp---------- #include "module.h"   (他のMain.cpp内の関数の都合上、Main.cppでもmodule.hをインクルードしています。関係あるかもしれないと思い書きました。) int main(){ M(); N(); } ------------------------ -------M.cpp---------- #include "module.h" void M(void){ mod_1(); mod_2(); } ---------------------- -------N.cpp---------- #include "module.h" void N(void){ mod_1(); mod_2(); } ---------------------- とすると、コンパイルの結果は次のようになります。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に M.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に M.obj で定義されています。 多重定義や多重インクルードは起こしていないと思っていますが、M.cppとN.cpp内の定義が衝突する理由がわかりません。どなたか理由が思いつく方、教えていただけたら幸いです。お願いいたします!! ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆ ちなみに、たとえばMやNとまったく同じ「A.cpp」を作り、このように書いたとします。 -------A.cpp---------- #include "module.h" void A(void){ mod_1(); mod_2(); } ---------------------- そしてmain関数の中に、MやNと同様に『A();』を付け加えたとします。 すると、実行結果はこのようになります。 1>M.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>M.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 VC++はファイル名のアルファベット順にコンパイルするようですが、どちらにせよmain関数内で呼び出されていること以外何の関わりも無いはずのA、M、Nの中での出来事が、衝突する理由が、調べども思い当たりません。 お願いいたします。

  • ビルドエラー

    現在wrapi(http://sysnet.ucsd.edu/pawn/wrapi/download.html)を使いサンプルプログラムWrapiTest.cpp をVC++6.0で実行を試みています。しかしコンパイルは通るのですビルドがうまくいきません。 ビルドしようとすると以下のエラーが出力しました。 リンク中... WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetPacketStats(struct DOT_11_STATS *)" (__imp_?WRAPIGetPacketStats@@YAJPAUDOT_11_STATS@@@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetAssociatedAP(unsigned char * const)" (__imp_?WRAPIGetAssociatedAP@@YAJQAE@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetRTSThreshold(unsigned long *)" (__imp_?WRAPIGetRTSThreshold@@YAJPAK@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPISetSSId(unsigned char *,unsigned long &)" (__imp_?WRAPISetSSId@@YAJPAEAAK@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetSSId(unsigned char *)" (__imp_?WRAPIGetSSId@@YAJPAE@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIOpenNdisDevice(unsigned short *)" (__imp_?WRAPIOpenNdisDevice@@YAJPAG@Z)" は未解決です (省略) Debug/WrapiTest.exe : fatal error LNK1120: 外部参照 7 が未解決です。 何が原因なのか教えていただけないでしょうか。 よろしくお願いします。

  • リリースモードの時にリンカエラーが発生します

    リリースモードの時にリンカエラーが発生します Visual Studioで、自作ライブラリを使ったプログラムの開発をしていたのですが、リリースモード時にリンカエラーが発生してしまいました。 デバッグモード時は特に問題なくリンクできるのですが、リリースモードでコンパイルをすると以下のようなエラーが発生します。 LibGame.lib(Game.obj) : error LNK2001: 外部シンボル ""bool __cdecl FileExists(class std::basic_string,class std::allocator >)" (?FileExists@@YA_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" は未解決です。 LibGame.lib(Mesh.obj) : error LNK2001: 外部シンボル ""public: struct ARCHIVE_ENTRY * __thiscall CArchive::Find(class std::basic_string,class std::allocator >)" (?Find@CArchive@@QAEPAUARCHIVE_ENTRY@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" は未解決です。 LibGame.lib(Mesh.obj) : error LNK2001: 外部シンボル ""class std::basic_string,class std::allocator > __cdecl ExtractFilePath(class std::basic_string,class std::allocator >)" (?ExtractFilePath@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@Z)" は未解決です。 Release/ShtGame.exe : fatal error LNK1120: 外部参照 3 が未解決です。 プロジェクトのプロパティ等でリンク先のライブラリを有無やヘッダをチェックしたのですが、原因がつかめませんでした。 どのようなエラー原因が考えられるでしょうか? よろしくお願いします OS:Windows XP SP3 言語:VC++ 開発環境:Visual Studio 2005 Academic Edition

  • メソッドの定義のoperatorと*operatorについて

    struct dBase { void *operator new(size_t size size) { return dAlloc(size);} void operator delete (void *ptr, size_t size){ dFree (ptr,size);} void *operator new[] (size_t size) { return dAlloc (size);} void operator delete[] (void *ptr, size_t size){ dFree (ptr, size);} }; 上記のプログラムは、ヘッダファイルの一部です。上記のoperatorと*operatorは、どのような意味があるのでしょうか?教えてください。

  • C++ の LNK2001エラー

    「sample.obj : error LNK2001: 外部シンボル ""void * __cdecl SetupDiGetClassDevsW(struct _GUID *,wchar_t const *,struct HWND__ *,unsigned long)" (?SetupDiGetClassDevsW@@$$FYAPAXPAU_GUID@@PB_WPAUHWND__@@K@Z)" は未解決です。」というエラーメッセージが出ます。  ソース中に extern "C" { #include "hidsdi.h" #include <setupapi.h> } #pragma comment(lib, "setupapi.lib") #pragma comment(lib, "hid.lib")  の記述をしています。  Visual C++ 2005 Express Edition で [プロジェクト] -> [プロパティ] -> [構成プロパティ] -> [リンカ] -> [追加のライブラリ] のところにディレクトリ設定も行っています。  どのようにしたら解決できるのでしょうか。

  • 多次元配列の new 2

    追加の質問ですみません^^; char の8個の配列へのポインタの配列を new する場合などは、以下のサンプルのように typedef しないとかけないんでしょうかね?たとえば、  char (**bb)[8] = new (char (*)[8])[8]; 書きたいように思いますが、これは文法違反ですし・・・^^; ==== サンプル:(iostream の初期化時に、定義した new が呼び出されるかもしれないことを一応考慮して、stdio の関数を使っています^^) #include <new> #include <stdlib.h> #include <stdio.h> void *operator new(std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new(): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete(void *p) { fprintf(stderr, "::delete(): %p\n", p); if (p) free(p); } void *operator new[](std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new[](): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete[](void *p) { fprintf(stderr, "::delete[](): %p\n", p); if (p) free(p); } int main() { typedef char (*T)[8]; char (**b)[8] = new T[8]; delete[] b; } ==== % ./a.exe ::new[](): 0x6e01b0 32 ::delete[](): 0x6e01b0

専門家に質問してみよう