使用Debug版本和Release版本管理/使用库

时间:2020-03-05 18:48:12  来源:igfitidea点击:

我对每个人为我们编写的应用程序使用或者分发库时的做法感到好奇。

首先,在开发应用程序时,我们是否链接了库的调试或者发行版本? (适用于在调试模式下运行应用程序的情况)

然后,当我们在发布之前以发布模式运行应用程序时,我们使用的是哪个内部版本的库?

如何在库的调试版本和发行版本之间进行切换?我们是手动执行此操作,使用宏还是执行其他任何操作?

解决方案

回答

首先,我将从库中确定什么要求:

  • 调试/发布
  • Unicode支持
  • 等等..

确定后,我们便可以为自己或者其他库用户所需的每种组合创建配置。

编译和链接时,对于所使用的配置,保持库和可执行文件的一致性非常重要,例如,链接时不要混用发行和调试。
我知道在Windows / VS平台上,如果将调试和发布库混入可执行文件中,这可能会引起微妙的内存问题。

正如Brian在Visual Studio中提到的那样,最好使用配置管理器来设置如何构建所需的每个配置。

例如,根据所生成的可执行文件,我们的项目要求以下配置可用。

  • 调试+ Unicode
  • 调试+ ASCII
  • 发行版+ Unicode
  • 发行版+ 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)将替换当前选择的配置(默认为Debug或者Release),这允许根据当前正在构建的配置来复制正确的项目。

如果对项目配置使用常规的命名约定,则可以使用$(ConfigurationName)宏,否则将很有用,否则可以只使用固定的字符串。

回答

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

我不确定我是否应该在svn树中同时保留调试版本和发布版本。尽管由于它们是自己的项目,所以将它们保留在另一个项目的svn树中并不正确。它们可以随时重新构建。

然后,我想找到一种使开关更多……嗯……基本上可以自动切换的方法,但这并不是我真正的意思。只是感觉在发布和调试之间手动切换文件是不正确的。也许我还没有找到它,但是我想要的是一个可以做到的选项:
对于库" stack.dll",请在" ...... \ 3rdParty "中查找发行版,并在" ...... \ 3rdPartyD "中进行调试。

那些我不知道的东西。你有什么建议?
请记住,库是外部项目。在那里,生成的文件完全在其他位置。实际上,我们可以考虑一下它,因为我们需要签出另一个项目,对其进行构建,然后如果需要另一个副本,则可以复制构建的库。我们将如何设置?