我有一个C ++ / MFC应用程序,我正在尝试使其更具可移植性,以便为跨平台转换为类似wxWidgets的内容做准备。
我的第一步是识别所有编译器和链接器依赖项,例如CRT库,Windows SDK和MFC,并将它们一起收集在与项目相同的文件存储库中,这样整个包就可以独立于任何特定的工作环境(WinSDK版本等),可能因计算机而异。
对于编译器依赖项,这相对容易。使用(/ X)选项
项目>属性> C / C ++>预处理器>忽略标准包含路径
我能够从
中定义的默认包含文件夹中分离项目工具>选项>项目和解决方案> VC ++目录
这当然会产生大量的编译错误,并将所有这些必需的库传输到我的文件库并手动将其新路径添加到
项目>属性> C / C ++>一般>其他包含目录
我能够确保我拥有编译器为我的项目所依赖的所有内容的副本。
然而,对于链接器来说并不是那么容易。虽然它确实有选项
项目>属性>链接器>一般>其他图书馆馆藏
用于添加自定义依赖项,我找不到让链接器忽略标准库路径以帮助我识别这些依赖项的方法。
我能找到的只是
项目>属性>链接器>输入>忽略所有默认库
但这根本不是一回事。它只是使链接器忽略标头中的pragma,这些pragma指定应链接到哪个库文件,但保留标准库路径可供链接器搜索。
最后,我不得不回到
工具>选项>项目和解决方案> VC ++目录
并删除所有"库文件"目录,以确保我不会无意中忽略依赖。这当然使得VS2008无法构建其他项目,我不想尝试实现相同类型的依赖性隔离。
编译器有这个有用的覆盖开关(/ X)用于禁用标准环境路径,但是链接器没有。这似乎很奇怪。
任何人都可以对此有所了解吗?或者我错过了什么?
答案 0 :(得分:0)
如何收集所有依赖关系,使您走向类似跨平台的东西?跨平台究竟以什么方式?如果您希望 source 在非VS或非Windows平台上进行编译,(这是我个人默认解释的跨平台')编组二进制依赖项与此无关它
如果您迁移到说wxWidgets,您仍然依赖于wxWidgets的版本 - 或任何其他框架 - 以及它的依赖项。封送二进制依赖关系也比它看起来要难得多:可再分发的二进制文件(CRT,MFC,OpenMP)是VS2008中的并排程序集,这实际上意味着磁盘上存在多个版本 - 通常在C:\ Windows下\ winSxS文件夹 - 您的应用程序通过其manifest引导Windows加载程序确切依赖于哪个版本。您可能在技术上能够跟踪它并选择您的特定版本,但它不会很有趣。
但是真的,为什么要止步呢? Win32 dll - user32,kernel32等 - 也是运行时依赖项,可能因环境而异,具体取决于安装的更新。我希望你不会尝试收集那些并放弃安装,我只是试图指出编组依赖关系不是可行的方法。
编辑: 通过跨平台,我可以说我个人将二进制依赖关系分为两类:
安装程序附带的东西 - 例如WinSDK,DirectX,CUDA。
没有安装人员的东西 - 例如自定义第三方组件。
关于类别(1):我维护一个开发站安装列表,并将其应用于我需要构建的所有工作站。关于类别(2):我将这些项目推送到源代码控制,并使用post build事件将它们放在approprite bin目录中。 (但是,您可能需要某些类型库的预构建事件。)