2013-02-26 72 views
0

我有一個包含17個子項目的MFC解決方案。我剛剛添加了另一個dll項目,無法將可執行文件鏈接到庫的重命名版本。在解決方案中的dll項目的設置中,調試版本都在輸出名稱後附加了'D'來表示它是調試版本。在某些情況下,我們通過將TargetName更改爲$(ProjectName)D來實現此目的,而在其他情況下,後構建事件會將其從構建目錄複製到lib目錄,並將其重命名爲附加'D'。對於這個項目,當我編譯DLL時,我得到兩個文件:MultiLangD.lib和MultiLangD.dll。這是dll項目鏈接器命令行:VS2010 C++ MFC多項目溶出覆蓋DLL項目的自動鏈接

/OUT:".\Debug\MultiLangD.dll" /NOLOGO /DLL /MANIFEST 
/ManifestFile:".\Debug\MultiLangD.dll.intermediate.manifest" /ALLOWISOLATION 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG 
/PDB:"C:\WorkSpaces\WorkSpace_CFFT_II_i18n\CFFT_i18n_MBCS\CFFT\MultiLang\Debug\MultiLangD.pdb" 
/PGD:"C:\WorkSpaces\WorkSpace_CFFT_II_i18n\CFFT_i18n_MBCS\CFFT\MultiLang\Debug\MultiLangD.pgd" 
/TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\Debug\MultiLangD.lib" /MACHINE:X86 
/ERRORREPORT:QUEUE 

這是dll項目編譯器命令行:

/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXEXT" /D 
"_MULTILANGDLL" /D "_CRT_SECURE_NO_WARNINGS" /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm 
/EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /GR- /Yu"StdAfx.h" 
/Fp".\Debug\MultiLangD.pch" /Fa".\Debug\" /Fo".\Debug\" /Fd".\Debug\vc100.pdb" /Gd 
/analyze- /errorReport:queue 

在可執行項目我列出MultiLangD.lib作爲一個額外的依賴,以鏈接器將「鏈接庫依賴關係」設置爲no,將「使用庫依賴關係輸入」設置爲yes。 MultiLang dll項目沒有設置爲可執行文件的項目依賴項。不過,在調試版本中,我得到一個錯誤,因爲鏈接器找不到MultiLang.lib。這是可執行項目的鏈接器命令行:

/OUT:".\Debug\WinGFApp.exe" /INCREMENTAL /NOLOGO /LIBPATH:"..\Lib" 
/LIBPATH:"..\Student\lib" /LIBPATH:"C:\Program Files (x86)\Microsoft DirectX SDK (March 2009)\Lib\x86" 
"MultiLangD.lib" "datastored.lib" "shlwapi.lib" "ws2_32.lib" "MdxReadd.lib" "winmm.lib" 
"dxguid.lib" "dxerr9.lib" "dinput8.lib" "Messagingd.lib" "dtccd.lib" "Version.lib" 
"SerialTCIMD.lib" "geosrvdll.lib" "NetworkUIDMD.lib" "amp2.lib" "idmmib.lib" 
"vmfr2.lib" "d3dx9.lib" "comsuppwd.lib" "vmf_net_db.lib" "jvmfd.lib" 
/NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libci" /MANIFEST 
/ManifestFile:".\Debug\WinGFApp.exe.intermediate.manifest" /ALLOWISOLATION 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:".\Debug/CFFTInstrD.pdb" 
/SUBSYSTEM:WINDOWS 
/PGD:"C:\WorkSpaces\WorkSpace_CFFT_II_i18n\CFFT_i18n_MBCS\CFFT\Instructor\Debug\WinGFApp.pg 
d" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE 

這是編譯器的命令行:

/I"." /I"..\Instructor\csw" /I"..\Instructor\CFFTInstr" /I"..\Student\common" 
/I"..\Student\Messaging" /I"..\Student\geotrans" /I"..\SerialTcim" /I"..\AudioServer" 
/I"..\NetworkUIDM\UIDM_Include" /I"..\NetworkUIDM\UIDM_JVMF" /I"..\NetworkUIDM" 
/I"..\Instructor\cas" /I"..\Jvmf" /I"..\Instructor\JvmfGui" /I"..\Instructor\JvmfCff" 
/I"..\NLOS" /I"C:\Program Files (x86)\Microsoft DirectX SDK (March 2009)\Include" /Zi 
/nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "NO_MSGS" /D 
"INSTRUCTOR" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES" 
/D "_CRT_NONSTDC_NO_DEPRECATE" /D "_VC80_UPGRADE=0x0600" /D "_MBCS" /Gm- /EHsc /RTC1 
/MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yu"stdafx.h" /Fp".\Debug/WinGFApp.pch" 
/Fa".\Debug/" /Fo".\Debug/" /Fd".\Debug/" /FR".\Debug\" /Gd /analyze-/errorReport:queue 

當我打開NP ++的.vcxproj文件,然後搜索MultiLang.lib只出現作爲發佈版本的依賴項,而在調試版本設置中列出了MultiLangD.lib。這是調試設置從.vcxproj文件ItemDefinitionGroup節點:

</ItemDefinitionGroup> 
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 
<Midl> 
    <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
    <MkTypLibCompatible>true</MkTypLibCompatible> 
    <SuppressStartupBanner>true</SuppressStartupBanner> 
    <TargetEnvironment>Win32</TargetEnvironment> 
    <TypeLibraryName>.\Debug/WinGFApp.tlb</TypeLibraryName> 
    <HeaderFileName> 
    </HeaderFileName> 
</Midl> 
<ClCompile> 
    <Optimization>Disabled</Optimization> 
    <AdditionalIncludeDirectories>.;..\Instructor\csw;..\Instructor\CFFTInstr;..\Student\common;..\Student\Messaging;..\Student\geotrans;..\SerialTcim;..\AudioServer;..\NetworkUIDM\UIDM_Include;..\NetworkUIDM\UIDM_JVMF;..\NetworkUIDM;..\Instructor\cas;..\Jvmf;..\Instructor\JvmfGui;..\Instructor\JvmfCff;..\NLOS;C:\Program Files %28x86%29\Microsoft DirectX SDK %28March 2009%29\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
    <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;NO_MSGS;INSTRUCTOR;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
    <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> 
    <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> 
    <PrecompiledHeader>Use</PrecompiledHeader> 
    <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> 
    <PrecompiledHeaderOutputFile>.\Debug/WinGFApp.pch</PrecompiledHeaderOutputFile> 
    <AssemblerListingLocation>.\Debug/</AssemblerListingLocation> 
    <ObjectFileName>.\Debug/</ObjectFileName> 
    <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName> 
    <BrowseInformation>true</BrowseInformation> 
    <WarningLevel>Level3</WarningLevel> 
    <SuppressStartupBanner>true</SuppressStartupBanner> 
    <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> 
</ClCompile> 
<ResourceCompile> 
    <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
    <Culture>0x0409</Culture> 
</ResourceCompile> 
<Link> 
    <AdditionalDependencies>MultiLangD.lib;datastored.lib;shlwapi.lib;ws2_32.lib;MdxReadd.lib;winmm.lib;dxguid.lib;dxerr9.lib;dinput8.lib;Messagingd.lib;dtccd.lib;Version.lib;SerialTCIMD.lib;geosrvdll.lib;NetworkUIDMD.lib;amp2.lib;idmmib.lib;vmfr2.lib;d3dx9.lib;comsuppwd.lib;vmf_net_db.lib;jvmfd.lib;%(AdditionalDependencies)</AdditionalDependencies> 
    <SuppressStartupBanner>true</SuppressStartupBanner> 
    <AdditionalLibraryDirectories>..\Lib;..\Student\lib;C:\Program Files %28x86%29\Microsoft DirectX SDK %28March 2009%29\Lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> 
    <IgnoreSpecificDefaultLibraries>libc;libcd;libci;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> 
    <GenerateDebugInformation>true</GenerateDebugInformation> 
    <ProgramDatabaseFile>.\Debug/CFFTInstrD.pdb</ProgramDatabaseFile> 
    <SubSystem>Windows</SubSystem> 
    <TargetMachine>MachineX86</TargetMachine> 
</Link> 
<Bscmake> 
    <SuppressStartupBanner>true</SuppressStartupBanner> 
    <OutputFile>Debug/CFFTInstrD.bsc</OutputFile> 
</Bscmake> 
<PostBuildEvent> 
    <Message>Copy Executable</Message> 
    <Command>if not exist ..\exec mkdir ..\exec 
    copy debug\WinGFApp.exe ..\exec\CFFTInstrD.exe 
    </Command> 
</PostBuildEvent> 
<ProjectReference /> 
<ProjectReference> 
    <UseLibraryDependencyInputs>true</UseLibraryDependencyInputs> 
    <LinkLibraryDependencies>false</LinkLibraryDependencies> 
</ProjectReference> 
</ItemDefinitionGroup> 

不幸的是,產生被複制到一個目錄後生成事件,所以我必須要遵循「追加d」命名的所有可執行文件和DLL約定來避免覆蓋其他版本的工件。我不確定爲什麼沒有其他的項目在構建中有這個問題。我明顯錯過了一些東西,但無法弄清楚它是什麼。有人能告訴我我做錯了什麼,以及如何做到這一點。謝謝。

編輯 我忘了提及我也嘗試在Common Properties-> Framework and References中添加對項目的引用。

Reference settings

此外,雖然編制正在進行中我看到Automatically linking with MultiLang.lib滾動通過。

回答

0

好的,我明白了。我刪除了引用,並將鏈接器 - >常規 - >忽略導入庫設置爲是。我把所有的東西都留下了,現在編譯和鏈接就好了。