2011-03-11 26 views
5

我有一个库,它支持#define来控制它的构建方式。然而,该库可以被多个想要不同版本的EXE项目使用。我可以让app/EXE项目在构建时设置库使用的#define,还是将其设置在解决方案中?您可以在加载的项目上创建一个VC++解决方案集预处理器#define吗?

我能想到的唯一的其他选择是在库项目上创建单独的构建配置,但这很快就会失去控制。对于例如unicode/non-unicode构建而言,这很常见,但最终会增加每个组合的配置数量。

+1

使用'config.h'文件来设置所需的预处理器定义,该库文件包含在库项目中,但由应用程序项目提供(缺点:每个解决方案文件不能包含多个应用程序项目) – smerlin 2011-03-11 17:07:09

+0

Isn'这与librik建议的相同吗? – 2011-03-14 13:02:37

+0

是的,事实上......只是注意到了答案(尽管我的评论是在5小时后写的..strange)。 – smerlin 2011-03-15 11:45:43

回答

5

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

您确实拥有对图书馆的控制权吗?步骤1-3将更改其项目文件,并且步骤4将一个文件添加到库源代码。

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

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

  3. 将Project Properties> General> Output Directory和Intermediate Directory设置为与解决方案目录相关的内容。也许$(SolutionDir)$(ProjectName)\$(Configuration)?您希望确保为每个使用它的解决方案重建库;不应该有任何共享的.lib或.obj文件。

  4. 创建一个名为mylibrary_solution_defines.h的空虚拟头文件,并将其放入您的库源代码中,以便#include "mylibrary_solution_defines.h"永远不会失败。

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

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

+0

谢谢,一直在寻找解决方案 – Paulus 2013-05-09 17:53:37

0

对于任何应用程序需要的每个库版本,您都需要单独的构建配置。这就是构建系统的设计方式。

唯一的出路是将'library'的源代码直接添加到相应的应用程序项目中并为每个项目设置正确的预处理器设置 - 这样,您仍然可以享受到共享代码库的好处。

+0

这太可怕了:(对于N这样的设置,你有2^N的build-configs。我希望我可以做一个项目将一个设置注入依赖项或使用预生成设置,或者有一些解决方案级别的设置。好吧。 – 2011-03-11 12:07:54

相关问题