none
既存ソースをもとに新しいプログラムを作る RRS feed

  • 質問

  • ベースとなるサンプルソースを元に、新しいプログラムをを作るため、次の手順を行いました。

    スタートページーファイルー新規プロジェクトー
    新しいプリジェクトのwin32プロジェクトを選択、プロジェクト名にttest3、OKとする
    win32アプリケーションウィザードで次へ、
    アプリケーションの種類でDLLにチェック、完了
    ttest3タブの大きな記入欄に、エディタで開いたソースをペースト。
    メニューのビルド、ソリューションのビルド
    出力ペインに、"_dllmain@12は既にttest3,objで定義されています”、ビルド失敗となります。

    この前にtest1,test2と同じ操作をしましたが、同じです。
    どうすればよいのでしょうか。


    長いですが、ログの結果です。

    コマンド ライン      一時ファイル ".rsp" を作成しています。内容 :
    [
    /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "TTEST3_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debug\ttest3.pch" /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /c /ZI /TP ".\ttest3.cpp"
    ]
    コマンド ライン "cl.exe @"c:\\\\Projects\ttest3\ttest3\Debug\RSP00002343165492.rsp" /nologo /errorReport:prompt" を作成しています。
    一時ファイル "c:\2.rsp" を作成しています。内容 :
    [
    /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "TTEST3_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /c /ZI /TP ".\dllmain.cpp"
    ]
    コマンド ライン "cl.exe @"c:\\\\Projects\ttest3\ttest3\Debug\RSP00002443165492.rsp" /nologo /errorReport:prompt" を作成しています。
    一時ファイル "c:\Documents and Settings\。内容 :
    [
    /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "TTEST3_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /Gm /EHsc /RTC1 /MDd /Yc"stdafx.h" /Fp"Debug\ttest3.pch" /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /c /ZI /TP ".\stdafx.cpp"
    ]
    コマンド ライン "cl.exe @"c:\\\Projects\ttest3\ttest3\Debug\RSP00002543165492.rsp" /nologo /errorReport:prompt" を作成しています。
    一時ファイル  を作成しています。内容 :
    コマンド ライン "rc.exe /fo".\Debug\ttest3.dll.embed.manifest.res" "c:\Documents and Settings\\Visual Studio 2008\Projects\ttest3\ttest3\Debug\TMP00002643165492.tmp"" を作成しています。
    一時ファイル  を作成しています。内容 :
    [
    /OUT:"C:\Documents and Settings\\My Documents\Visual Studio 2008\Projects\ttest3\Debug\ttest3.dll" /INCREMENTAL /DLL /MANIFEST /MANIFESTFILE:"Debug\ttest3.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Documents and Settings\\Visual Studio 2008\Projects\ttest3\Debug\ttest3.pdb" /SUBSYSTEM:WINDOWS /DYNAMICBASE /NXCOMPAT /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

    ".\Debug\stdafx.obj"

    ".\Debug\ttest3.obj"

    ".\Debug\dllmain.obj"

    ".\Debug\ttest3.dll.embed.manifest.res"
    ]
    コマンド ライン "link.exe @"c:\\\\Visual Studio 2008\Projects\ttest3\ttest3\Debug\RSP00002743165492.rsp" /NOLOGO /ERRORREPORT:PROMPT" を作成しています。
     出力ウィンドウ      コンパイルしています...
    stdafx.cpp
    コンパイルしています...
    ttest3.cpp
    c:\\\visual studio 2008\projects\ttest3\ttest3\ttest3.cpp(225) : warning C4996: 'strcat': This function or variable may be unsafe. .
    コンパイルしています...
    dllmain.cpp
    マニフェストをリソースにコンパイルしています...
    Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
    Copyright (C) Microsoft Corporation.  All rights reserved.
    リンクしています...
    dllmain.obj : error LNK2005: _DllMain@12 は既に ttest3.obj で定義されています。
       ライブラリ C:\\\\Visual Studio 2008\Projects\ttest3\Debug\ttest3.lib とオブジェクト C:\\\\Visual Studio 2008\Projects\ttest3\Debug\ttest3.exp を作成中
    C:\\\\Visual Studio 2008\Projects\ttest3\Debug\ttest3.dll : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
     結果      ビルドログは "\Debug\BuildLog.htm" に保存されました。
    ttest3 - エラー 2、警告 1



    • 編集済み sige2 2012年7月8日 23:12
    2012年7月8日 4:54

回答

  • エラーウィンドウからはわかりづらいですが、出力ウィンドウ(貼り付けられているログの部分)を見れば答えが書かれています。

    dllmain.obj : error LNK2005: _DllMain@12 は既に ttest3.obj で定義されています。

    つまり、dllmain.cppとttest3.cppのどちらにも DllMain() という関数が含まれています。正しくない側を削除してください。

    • 回答としてマーク 山本春海 2012年8月13日 7:42
    2012年7月9日 0:34

すべての返信

  • エラーウィンドウからはわかりづらいですが、出力ウィンドウ(貼り付けられているログの部分)を見れば答えが書かれています。

    dllmain.obj : error LNK2005: _DllMain@12 は既に ttest3.obj で定義されています。

    つまり、dllmain.cppとttest3.cppのどちらにも DllMain() という関数が含まれています。正しくない側を削除してください。

    • 回答としてマーク 山本春海 2012年8月13日 7:42
    2012年7月9日 0:34
  • 適切なコメントありがとうございます。いずれかのdllmainの関数を別名とすればビルドは成功しました。
    ビルド対象ソースとして、・dllmain.cppと・ttest3.cppがあって
    ・dllmain.cppは関数dllmain()のみ
    ・ttest3.cppは関数dllmain()と実際の関数()
    があったのですが、DLLとしてビルドするためには、dllmain.cppファイルが必須である条件は必要ないでしょうね。
    実際は
    ・dllmain.cppは xdllmain()とし、ttest3.cpp の方はは dllmain() とするか、
    ・dllmain.cppは dllmain()とし、ttest3.cpp  の方ははxdllmain() とするか、
    のいずれも試しましたが、ビルド自体は成功しています。
    2012年7月9日 14:52