如何定义自定义构建配置类型,使得通常是 .exe 的目标成为 DLL。

4

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

这很好用,但我还想生成第三个配置,它将构建一个DLL。我知道在CMake中我们可以使用add_library(LibraryName SHARED [files])来生成一个单独的项目,该项目创建了一个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>)的东西可能 - dewaffled
1
据我所知,这是不可能的。此外,这实际上是一个非常糟糕的想法,因为dll/exe之间在概念上有很多不同之处。你为什么需要那个? 但是,你可以创建一个对象库(或静态库),它将编译大部分文件,然后添加两个目标:1个可执行文件,1个dll,每个目标都有一个特定的文件定义入口点(如果有)。 最后:CMake通常创建4个配置... 你删除了RelWithDebInfo和MinSizeRelease吗? - Synxis
@Synxis 我不确定我们是否在同一页面上。我正试图做的就是这样,有3个目标,其中2个构建可执行文件,1个构建DLL。我为每个构建目标设置了不同的入口点,并且正在处理一个已经运行良好的相当大的代码(我们可以轻松手动生成DLL和exe)。我想做的唯一一件事就是让CMake自动化我们手动进行的配置。 - eclmist
@Synxis 其实,当项目专门设计为同时导出两者时(使用正确的预处理器等),实际上并没有太大的区别。真正的问题只是选择性地导出正确的入口点并公开某些 API 调用。许多项目都这样做,你为什么认为这是一个“非常糟糕的想法”呢? - eclmist
没有CMake项目会这样做,因为这不是cmake配置的目的。它们主要用于更改编译器标志,即对于相同的输出类型,如何构建它。您想要更改输出类型...此外,即使您可以为此类配置传递特定标志,cmake仍将将其视为原始类型(可执行文件而不是库),这可能会导致许多关于导出、传递依赖项等方面的错误。只需按照Brecht的答案即可。 - Synxis
如果这真的是CMake的限制,那么CMake并不适合我们的项目。在工作中,我们可以轻松地使用SharpMake来完成这个任务,所以这绝对是一个经过验证的可行模式。毕竟,我们只是在生成makefile,这不应该是什么大问题。此外,“输出类型”只是另一个编译器标志而已。 - eclmist
1个回答

1

您可以使用add_library(LibraryName [files])而不是add_library(LibraryName SHARED [files]),然后使用-DBUILD_SHARED_LIBS:BOOL=OFF-DBUILD_SHARED_LIBS:BOOL=ON来分别构建静态或共享库。但这需要您运行两次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)

你可能还需要复制其他行(例如target_link_librariesinstall)以使用_shared目标构建静态和共享库。我经常使用这种方法为那些没有为此设计CMakeLists.txt的库同时构建静态和共享库。
由于你通过这种方式添加了一个单独的目标,因此你也应该能够为它指定一个单独的输出名称和目录。

我在问题中提到add_library会生成单独的“项目”,这不是我想要的。我想要生成与调试、发布、relwithdebinfo和minsizerel配置并列的单独的“配置”。我不确定如何实现这一点。 - eclmist
你所说的“分离配置”具体是什么意思呢?就像这样:cmake -DBUILD_SHARED_LIBS:BOOL=OFF -S. -Bbuild_staticcmake -DBUILD_SHARED_LIBS:BOOL=ON -S. -Bbuild_shared这样做,以便您可以通过CMake以不同的方式配置2个构建库? - Brecht Sanders
1
配置。就像调试配置一样。或者是发布、带有调试信息的发布和最小尺寸发布配置。就像当你执行 -DCMAKE_CONFIGURATION_TYPES:STRING="Debug;Release;" -DCMAKE_BUILD_TYPE=Release 时,这些配置。 - eclmist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接