你能在VC++解决方案中为加载的项目设置预处理器#defines吗?

Mr.*_*Boy 5 build-process visual-studio-2008 visual-c++

我有一个库,它支持#define来控制它的构建方式.但是,该库可以由需要不同版本的多个EXE项目使用.我可以让app/EXE项目在构建时设置库使用的#define,还是在解决方案中设置它?

我能想到的唯一另一个选择是在库项目上创建一个单独的构建配置,但很快就会失控.这对于例如unicode/nonicode构建来说很常见,但是你最终会将每个组合的配置数量相乘.

lib*_*rik 5

以下方法假定每个.EXE/app(使用此库)都有自己的Visual Studio解决方案.

你确实可以控制图书馆,对吗?步骤1-3将更改其项目文件,步骤4将文件添加到库源代码.

  1. 设置项目属性> C/C++>高级>强制包含到mylibrary_solution_defines.h.

  2. 编辑项目属性> C/C++>常规>其他包含目录以放在$(SolutionDir);目录列表的开头.

  3. 将项目属性>常规>输出目录和中间目录设置为相对于解决方案目录的内容.也许$(SolutionDir)$(ProjectName)\$(Configuration)吧?您希望确保为每个使用它的解决方案重建库; 不应该共享.lib或.obj文件.

  4. 创建一个空的虚拟头文件mylibrary_solution_defines.h,并将其放入库源代码中,这样#include "mylibrary_solution_defines.h"就永远不会失败.

  5. 在每个app/EXE解决方案中 - 假设您为使用此库的每个应用程序提供不同的解决方案,否则整个计划将失败 - 创建一个mylibrary_solution_defines.h包含#defines 的文件.

你看到发生了什么吗?每个库源文件都是隐式#include"mylibrary_solution_defines.h",它优先从解决方案目录中获取该文件.因此,每个解决方案的文件都可以不同.因此,如果您的解决方案ConsoleModeInterfaceProgram.sln需要使用构建的库#define TEXTONLY 1,请将该行放入mylibrary_solution_defines.h与其相同的目录中ConsoleModeInterfaceProgram.sln.