在windows上构建和部署dll:SxS、清单等等
自VS2005以来,我发现不可能简单地针对MS运行时构建dll并将它们一起部署()。我对清单、SxS和co深感困惑:MSDN文档非常糟糕,带有循环引用;特别是因为我更喜欢Unix,所以我发现所有这些都没有信息。我的核心问题是将dll链接到msvc9或msvc8:既然这些运行时是不可再分发的,那么链接和部署这样一个dll的步骤是什么?特别是,清单是如何生成的(我不想要mt.exe,我想要跨编译器移植的东西),它们是如何嵌入和使用的?并排装配是什么意思 基本上,我在哪里可以找到任何类型的规范而不是MS术语在windows上构建和部署dll:SxS、清单等等,windows,dll,manifest,sxs,Windows,Dll,Manifest,Sxs,自VS2005以来,我发现不可能简单地针对MS运行时构建dll并将它们一起部署()。我对清单、SxS和co深感困惑:MSDN文档非常糟糕,带有循环引用;特别是因为我更喜欢Unix,所以我发现所有这些都没有信息。我的核心问题是将dll链接到msvc9或msvc8:既然这些运行时是不可再分发的,那么链接和部署这样一个dll的步骤是什么?特别是,清单是如何生成的(我不想要mt.exe,我想要跨编译器移植的东西),它们是如何嵌入和使用的?并排装配是什么意思 基本上,我在哪里可以找到任何类型的规范而不是M
感谢所有回答的人,这真的很有帮助,好吧,我遇到了一些问题,所以我的一些评论可能会有所帮助
您可能需要在Vista上进行测试,以确保其正常工作。它们是可再发行的,并且您在msvs目录中有可再发行的软件包 使用您选择的运行时构建,将相应的包添加到您的安装程序中,不必费心-它会工作的。不同之处在于——它们现在安装在不同的地方(但这也是应用程序查找库的地方)
>,MSDN或基本上任何一本不太老的Windows C++编程书籍。
< P>这是博客条目。它包括解释静态链接crt有多糟糕,以及为什么不应该这样做这是答案。谢谢你的回答。就部署本身而言,我可以看到3个选项,然后:
- 使用.msi merge指令
- 使用可再发行的VS包并在我自己的安装程序之前运行它
- 沿着我自己的应用程序复制可再发行的文件。但是在本例中,我如何在文件系统层次结构中引用它(比如bar/foo1/foo1.dll和bar/foo2/foo2.dll在bar/中引用msvcr90.dll)?我的意思是,除了明显和丑陋的“复制每个目录中的dll,你有依赖它的dll”)
/*----------------------------------------------------------------------------*/
#if _MSC_VER >= 1400
/*----------------------------------------------------------------------------*/
#pragma message ( "Setting up manifest..." )
/*----------------------------------------------------------------------------*/
#ifndef _CRT_ASSEMBLY_VERSION
#include <crtassem.h>
#endif
/*----------------------------------------------------------------------------*/
#ifdef WIN64
#pragma message ( "processorArchitecture=amd64" )
#define MF_PROCESSORARCHITECTURE "amd64"
#else
#pragma message ( "processorArchitecture=x86" )
#define MF_PROCESSORARCHITECTURE "x86"
#endif
/*----------------------------------------------------------------------------*/
#pragma message ( "Microsoft.Windows.Common-Controls=6.0.0.0")
#pragma comment ( linker,"/manifestdependency:\"type='win32' " \
"name='Microsoft.Windows.Common-Controls' " \
"version='6.0.0.0' " \
"processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
"publicKeyToken='6595b64144ccf1df'\"" )
/*----------------------------------------------------------------------------*/
#ifdef _DEBUG
#pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT=" _CRT_ASSEMBLY_VERSION )
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
"name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' " \
"version='" _CRT_ASSEMBLY_VERSION "' " \
"processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
"publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
#pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT=" _CRT_ASSEMBLY_VERSION )
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
"name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' " \
"version='" _CRT_ASSEMBLY_VERSION "' " \
"processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
"publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif
/*----------------------------------------------------------------------------*/
#ifdef _MFC_ASSEMBLY_VERSION
#ifdef _DEBUG
#pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION )
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
"name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' " \
"version='" _MFC_ASSEMBLY_VERSION "' " \
"processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
"publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
#pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION )
#pragma comment(linker,"/manifestdependency:\"type='win32' " \
"name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' " \
"version='" _MFC_ASSEMBLY_VERSION "' " \
"processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
"publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif
#endif /* _MFC_ASSEMBLY_VERSION */
/*----------------------------------------------------------------------------*/
#endif /* _MSC_VER */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
#如果_MSC\u VER>=1400
/*----------------------------------------------------------------------------*/
#杂注消息(“设置清单…”)
/*----------------------------------------------------------------------------*/
#ifndef\U CRT\U组件\U版本
#包括
#恩迪夫
/*----------------------------------------------------------------------------*/
#ifdef WIN64
#杂注消息(“processorArchitecture=amd64”)
#定义MF_处理器体系结构“amd64”
#否则
#杂注消息(“processorArchitecture=x86”)
#定义MF_处理器体系结构“x86”
#恩迪夫
/*----------------------------------------------------------------------------*/
#pragma消息(“Microsoft.Windows.Common Controls=6.0.0.0”)
#pragma注释(链接器,“/manifestdependency:\”类型='win32''\
“name='Microsoft.Windows.Common控件'\
“版本='6.0.0.0'”\
“processorArchitecture=”“MF_processorArchitecture”\
“publicKeyToken='6595b64144ccf1df'\”)
/*----------------------------------------------------------------------------*/
#ifdef_调试
#pragma消息(uuuu库\程序集\名称\前缀“.DebugCRT=“\ucrt\程序集\版本”)
#pragma注释(链接器,“/manifestdependency:\”类型='win32''\
“名称=”“\uuuuu库\uu程序集\uu名称\uu前缀”.DebugCRT'”\
“版本='”\u CRT\u程序集\u版本“\
“processorArchitecture=”“MF_processorArchitecture”\
“publicKeyToken=”\u VC\u程序集\u publicKeyToken“'\”)
#否则
#pragma消息(uuu库u程序集u名称u前缀“.CRT=“CRT\uAssembly\u版本)
#pragma注释(链接器,“/manifestdependency:\”类型='win32''\
“名称='”\uuuuu库\uu程序集\uu名称\uu前缀“.CRT'”\
“版本='”\u CRT\u程序集\u版本“\
“processorArchitecture=”“MF_processorArchitecture”\
“publicKeyToken=”\u VC\u程序集\u publicKeyToken“'\”)
#恩迪夫
/*----------------------------------------------------------------------------*/
#ifdef_MFC_组件_版本
#ifdef_调试
#pragma消息(uuu库\程序集\名称\前缀“.MFC=“\u CRT\程序集\版本”)
#pragma注释(链接器,“/manifestdependency:\”类型='win32''\
“名称='”_库\程序集\名称\前缀“.MFC'”
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT