【问题标题】:Generate DLL configuration type with CMake使用 CMake 生成 DLL 配置类型
【发布时间】:2020-06-21 13:35:16
【问题描述】:

我正在使用 CMake 生成我的 Visual Studio 解决方案。现在,CMake 在一个项目下生成两个配置ReleaseDebug。两种配置都构建了一个 win32 (.exe) 应用程序。

这很好用,但我还想生成第三个配置,它会构建一个 DLL。我知道在 CMake 中我们可以使用 add_library(LibraryName SHARED [files]) 生成一个单独的 project 来创建构建 DLL 目标,但这不是我想要的。相反,我想在 Visual Studio 中生成一个DLL 配置,旁边是DebugRelease

我可以通过在 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 的回答

标签: c++ cmake


【解决方案1】:

您可以保留add_library(LibraryName [files]) 而不使用STATICSHARED 而不是add_library(LibraryName SHARED [files]),然后您可以使用-DBUILD_SHARED_LIBS:BOOL=OFF-DBUILD_SHARED_LIBS:BOOL=ON 运行CMake 来分别构建静态或共享库。

但这需要你运行两次 CMake 并编译两次。

要构建静态和共享,您可以在 CMakeLists.txt 中替换它:

add_library(LibraryName [files])

与:

add_library(LibraryName STATIC [files])
add_library(LibraryName_shared SHARED [files])
set_target_properties(LibraryName_shared PROPERTIES OUTPUT_NAME LibraryName)

您可能还必须使用_shared 目标复制其他行(例如target_link_librariesinstall)。

我经常使用这种方法为 CMakeLists.txt 不适合这样做的库一次性构建静态和共享库。

当您以这种方式添加单独的目标时,您还应该能够为其指定单独的输出名称和目录。

【讨论】:

  • 我在问题中提到 add_library 生成单独的项目,这不是我想要的。我希望生成单独的配置,以及调试、发布、relwithdebinfo 和 minsizerel 配置。我不确定我能否看到这将如何实现单独的配置
  • separate configurations 到底是什么意思?是不是就像你做 cmake -DBUILD_SHARED_LIBS:BOOL=OFF -S. -Bbuild_staticcmake -DBUILD_SHARED_LIBS:BOOL=ON -S. -Bbuild_shared 这样你有 2 个 CMake 配置不同的构建库?
  • 配置。就像调试配置一样。或 Release、RelWithDebInfo 和 MinSizeRel 配置。就像你做-DCMAKE_CONFIGURATION_TYPES:STRING="Debug;Release;" -DCMAKE_BUILD_TYPE=Release时一样,那些配置
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2012-02-11
  • 2022-01-17
  • 2020-04-10
相关资源
最近更新 更多