【发布时间】:2020-06-21 13:35:16
【问题描述】:
我正在使用 CMake 生成我的 Visual Studio 解决方案。现在,CMake 在一个项目下生成两个配置Release 和Debug。两种配置都构建了一个 win32 (.exe) 应用程序。
这很好用,但我还想生成第三个配置,它会构建一个 DLL。我知道在 CMake 中我们可以使用 add_library(LibraryName SHARED [files]) 生成一个单独的 project 来创建构建 DLL 目标,但这不是我想要的。相反,我想在 Visual Studio 中生成一个DLL 配置,旁边是Debug 和Release。
我可以通过在 CMakeList 中添加 set(CMAKE_CONFIGURATION_TYPES Release Debug DLL) 来获取配置,但我不确定如何实际配置它。如何让这个自定义配置真正构建一个 DLL?如果可能,我还想自定义此配置的输出名称和目录,就像我可以使用 CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE 等一样。
这可能吗?
【问题讨论】:
-
类似
add_compile_options($<$<CONFIG:DLL>:/LD>)maybe。 -
AFAIK,这是不可能的。此外,这实际上是一个非常糟糕的主意,dll/exe 之间在概念上存在很多差异。你为什么需要那个?但是,您可以创建一个可以编译大部分文件的对象库(或静态库),然后再添加 2 个目标:1 个可执行文件、1 个 dll,每个目标都有一个定义入口点的特定文件(如果有的话)。上一篇:CMake 通常会创建 4 个配置...你删除了 RelWithDebInfo & MinSizeRelease 吗?
-
@Synxis 我不确定我们是否在同一页面上。我正在尝试这样做,有 3 个目标,其中 2 个构建可执行文件,1 个构建 DLL。我对每个构建目标都有不同的入口点,并且正在编写一个已经运行良好的相当大的代码(我们可以轻松地手动生成 DLL 和 exe)。我唯一想做的就是让 CMake 自动化我们手动执行的配置。
-
@Synxis 同样,当项目专门设计用于导出两者(使用正确的预处理器等)时,实际上并没有太大区别。真的只是有选择地导出正确的入口点并公开某些 api 调用。很多项目都是这样做的,为什么你会认为这是一个“非常糟糕的主意”?
-
没有 CMake 项目这样做,因为它不是 cmake 配置的用途。它们主要用于更改编译器标志,即对于相同的输出类型,如何构建它。您想更改输出类型...此外,即使您可以为此类配置传递特定标志,cmake 仍会将其视为原始类型(可执行文件而不是库),这将可能会导致很多关于导出、传递依赖等的错误。只需遵循 Brecht 的回答