【问题标题】:Multiple project output types: compiling as an EXE and a LIB多种项目输出类型:编译为 EXE 和 LIB
【发布时间】:2013-07-20 02:18:30
【问题描述】:

我有一个构建为 EXE 的 C++ 项目。但是,我还需要将项目构建为静态库(.LIB 文件)。现在为了获得完整的构建,我需要以一种格式构建它,然后打开项目属性并在 General > Project Defaults > Configuration Type 下选择另一种格式,接受并重新编译。这是一个真正的麻烦。有什么方法可以指定这两种类型吗?我在 MSDN 上没有看到任何关于此的内容。

我使用的是 Visual Studio 2012。

【问题讨论】:

    标签: c++ visual-studio-2012 project-properties


    【解决方案1】:

    解决问题的一种常见(特别是理智)方法是拥有一个包含两个项目的解决方案。第一个项目应该是一个包含大部分代码的库(静态或动态链接,没关系)。第二个项目应该是一个可执行文件,它引用您在第一个项目中创建的库。

    这样做,您的解决方案的单个构建将生成可执行文件和库。

    【讨论】:

    • 我希望能够将大部分代码分解成一个单独的项目。这就是我在指定这件事时想要的。不幸的是,我的要求排除了这一点。不过感谢您的想法。
    【解决方案2】:

    创建两个项目,将同一组源文件添加到两者。

    【讨论】:

    • 复制文件数量没有意义;每次更改源时,您都需要加倍努力。
    • @pmcs:为什么?我不是说复制每个文件并将原始文件添加到一个项目中,然后将副本添加到另一个项目中——我是说将相同的文件添加到两个项目中。任何更改都会出现在两个项目中,因为它是同一个物理文件。
    • 假设你有几百个头文件和源文件,分布在很多目录中。对于一个积极开发的项目,目录结构可能不稳定,更不用说单个文件本身了。每次修改库项目中的目录结构时,都必须手动更新可执行项目。在同一个解决方案中拥有一个库项目和一个引用该库的可执行文件会更好。这是完全标准的做法。
    【解决方案3】:

    这是一个相当古老的线程,但对于后代:如果您的项目有一个极简的 main.cpp,您可以从构建生成的整个 .obj 构建一个库,除了 main.obj。 一种典型的方法是在预链接事件上添加此构建:

    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    [...]
      <PreLinkEvent>
        <Command>@ECHO ON
        "lib.exe" /NOLOGO /OUT:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"
        "lib.exe" /NOLOGO "$(OutDir)$(ProjectName).lib" /REMOVE:"$(IntermediateOutputPath)main.obj"</Command>
      </PreLinkEvent>
    </ItemDefinitionGroup>
    

    它适用于 Visual Studio 2010 和 2019(未使用中间版本进行测试)。

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      相关资源
      最近更新 更多