多项目配置C++

Multiple Project Configurations C++

本文关键字:C++ 配置 项目      更新时间:2023-10-16

我使用Visual Studio 2017(但适用于2010+之后的任何版本),我一直在努力想出一种方法来组织我的调试/发布库,以避免在混合不同版本的运行库时出现所有这些链接错误。从概念上讲,我的目标似乎很简单,但我还没有找到实现我想要的一切的方法。

以下是我所拥有的,以及我想做的:


公共库:
ComLib1
CompLib2
。。。


Exe1:
ComLib1
CompLib2

Exe1Lib1
Exe1Lib2

Exe1


Exe2:
ComLib1
CompLib2

Exe2Lib1
Exe2Lib2

Exe2


So 2个不同的可执行文件,使用一组公共库和Exe特定库。

我想创建4种不同的构建配置。

Cfg1:
这将包含所有库(包括公共库)的调试信息/未优化代码。

Cfg2:
这将包含所有Exe特定库的调试信息/未优化代码,但不包括公共库。

Cfg3:
这将包含一些库的调试信息/未优化的代码库,以及其余库的未调试信息/优化的库的组合。

Cfg4:
你猜对了。这将包含非调试信息和所有优化的代码。

我的第一次尝试是基本上为每个库创建2组二进制文件;一个在调试模式下编译(带有/MTd/Od),另一个在发布模式下编译,带有(/MT/O2)。然后在我的各种配置中选择一个或另一个版本。这对Cfg1&Cfg4(因为所有运行库自始至终都是一致的),但在Cfg2&参考3.

我理解我为什么会犯这些错误。我只是不确定如何解决这些问题,我认为这是一种常见的情况。也许Cfg3并不常见,但我认为Cfg1,2&4个是。

感谢您的投入。


EDIT
我真的不认为我需要添加这些信息,因为我想简短地回答我的问题(呃)。但如果它能帮助我澄清我的目标,我会把它加起来。

这是一个实时模拟器。我只是不能在典型的调试配置中运行每个库,因为我无法维护实时性。我很少需要调试公共库,因为它们大多与服务器/IO任务有关。Exe-lib主要包含数学/热力学,是我花时间最多的地方。然而,1 Exe lib包含反应堆中子学,涉及大量计算。我们通常将其视为一个黑盒(供应商提供的神秘代码),我几乎总是想使用优化代码(典型的发布设置)来运行它。

如果没有一些特殊考虑,您就不能在同一进程中使用不同的运行时库(例如,在接口中没有CRT对象的情况下使用DLL左右,使它们完全分离),而不会出现链接错误或在CRT对象之间传递时冒运行时问题的风险。

您可以在一个模块中混合大多数通用优化选项,但值得注意的例外是,所有对象的链接时间代码生成必须相同。只要您自己的代码没有得到优化,发行版运行库通常也可用于调试。

为了方便地切换,您需要为您想要的每种情况提供一个解决方案配置(因此为4)。如果您不希望一个项目配置被多个解决方案配置使用,但它必须遵循前面提到的限制,并且可能会混淆输出目录等内容,那么您可以将一个项目的配置由多个方案配置使用。还可以使用特性表在多个项目和配置之间共享设置。

我使用预定义的宏为输出目录路径或目标文件名执行了类似的操作
例如,我使用扩展为Win32_DebugWin32_Release$(Platform)_$(Configuration)

您也可以使用环境变量。我还没有尝试使用预处理器宏。

在互联网上搜索"MSDN Visual Studio预定义宏$(平台)"。

所以这就是我最终得到想要的东西的原因。

假设我使用的是静态运行库,我想我会为我的公共库保留典型的Debug/Release(分别为/MTd和/MT)库,并为我的Exe创建3组库:

Exe1Lib1Rlease:典型发布配置
Exe1Lib1Debug:典型调试配置
Exe1Lib1DebugMT:带有调试信息的非优化代码,但使用MT运行库

Cfg1:
将在周围使用典型的调试库

Cfg2&Cfg3:
将为公共库使用典型的Release库,并为Exe的库使用Exe1Lib1DebugMT

Cfg4:
将全面使用典型的Release库。


EDIT
实际上,Cfg2&Cfg3设置更准确地表示为:

Cfg2:
将为公共库使用典型的Release库,并为Exe的库使用Exe1Lib1DebugMT

Cfg3:
将使用常见库的典型Release库,以及Exe库的Release和Exe1Lib1DebugMT的组合