【问题标题】:Managing/Using libraries with Debug builds vs Release builds通过调试版本与发布版本管理/使用库
【发布时间】:2010-09-07 22:17:10
【问题描述】:

我很好奇每个人在为您编写的应用程序使用或分发库时的做法。

首先,在开发应用程序时,您会链接库的调试版本还是发布版本? (当您在调试模式下运行应用程序时)

那么当您在部署之前以发布模式运行您的应用程序时,您使用哪个版本的库?

如何在库的调试版本和发布版本之间进行切换?你是手动做的,你使用宏,还是你做的其他什么?

【问题讨论】:

    标签: release-builds debug-build


    【解决方案1】:

    我会先从库中确定需要哪些要求:

    1. 调试/发布
    2. Unicode 支持
    3. 等等..

    确定后,您可以为自己或其他图书馆用户所需的每个组合创建配置。

    在编译和链接时,保持库和可执行文件与所使用的配置一致是非常重要的,即在链接时不要混合发布和调试。 我知道在 Windows/VS 平台上,如果调试和发布库混合在可执行文件中,这可能会导致细微的内存问题。

    正如 Brian 向 Visual Studio 提到的,最好使用配置管理器来设置您希望如何构建所需的每个配置。

    例如,我们的项目需要以下配置可用,具体取决于正在构建的可执行文件。

    1. 调试+Unicode
    2. 调试+ASCII
    3. 发行版+Unicode
    4. 发布+ASCII

    此特定项目的用户使用配置管理器将他们的可执行需求与项目的可用配置相匹配。

    关于宏的使用,它们广泛用于实现编译时决策以满足需求,例如是否要链接函数的调试或发布版本。如果您使用的是 VS,您可以查看预处理器定义属性以了解如何定义各种宏,例如_DEBUG _RELEASE,这是配置控制编译的方式。

    您使用什么平台来编译/链接您的项目?

    编辑:扩展您更新的评论..

    如果您无法使用 配置管理器 选项,那么我建议您使用项目中的以下属性:

    • 链接器->其他库目录链接器->输入

    使用宏 $(ConfigurationName) 链接适当的库配置,例如调试/发布。

    $(ProjectDir)\..\third-party-prj\$(ConfigurationName)\third-party.lib
    
    • 构建事件自定义构建步骤配置属性

    在构建发生之前(或之后)从依赖项目执行所需库文件的副本。

    xcopy $(ProjectDir)\..\third-party-prj\$(ConfigurationName)\third-party.dll $(IntDir)
    

    $(ProjectDir) 将替换当前项目的位置,并导致操作相对于当前项目发生。 宏 $(ConfigurationName) 将替换当前选择的配置(默认为 DebugRelease),它允许根据当前正在构建的配置复制正确的项目。

    如果您对项目配置使用常规命名约定,这将有所帮助,因为您可以使用 $(ConfigurationName) 宏,否则您可以简单地使用固定字符串。

    【讨论】:

      【解决方案2】:

      我使用 VS。我这样做的方式是通过项目的引用获得我需要的库。这基本上只是说在项目加载时在哪个文件夹中查找特定库。我将我的库开发为尽可能独立于项目或可重用。因此,它们都是他们自己的项目。因此,在特定项目所需的库中,我在 svn 文件夹树中创建了与“src”文件夹相同级别的“3rdParty”或“libs”文件夹。我倾向于只使用已发布的库,但是当我遇到一些未知问题并想切换到调试时,我会手动复制“lib”文件夹中文件的调试版本并重新加载项目。

      我不确定我是否应该在我的 svn 树中同时保留调试版本和发布版本。虽然由于它们是自己的项目,但将它们保留在另一个项目的 svn 树中是不对的。它们可以随时重新构建而不会出现故障。

      然后我想找到一种方法来使切换更加...嗯...如果你有的话,基本上是自动的,但这不是我真正的意思。只是觉得在released和debug之间手动切换文件是不对的。也许我还没有找到它,但我想要的是一个喜欢的选项: 对于库“stack.dll”,在“......\3rdParty\”中查找用于发布,在“......\3rdPartyD\”中查找用于调试。

      任何我不知道的东西。你有什么建议? 请记住,库是外部项目。那里构建的文件完全在其他地方。事实上,如果你想要另一个副本,你必须检查另一个项目,构建它,然后复制构建的库。你会如何设置它?

      【讨论】:

        猜你喜欢
        • 2010-10-27
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 2011-04-16
        相关资源
        最近更新 更多