如何防止CMake发布/IIMPLIB

How to prevent CMake from issuing /IMPLIB

本文关键字:IIMPLIB 发布 CMake 何防止      更新时间:2023-10-16

我有一个CMake构建,它将IMPLIB发送到Windows上的链接器。在我的情况下,这是一个问题,因为implib的参数与其中一个输入文件的路径相同。在我看来,在使用Visual Studio进行构建时,CMake将始终发布/IIMPLIB,并且无法修改传递的参数。有没有办法控制这种行为?

我认为不可能阻止CMake向链接器发出/IMPLIB选项。但是,您可以通过设置共享库目标的以下属性来控制生成的导入库的名称:

add_library(foo SHARED foo.cpp)
# set base name of generated DLL import library
set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_NAME "bar")
# set prefix of generated DLL import library
set_target_properties(foo PROPERTIES IMPORT_PREFIX "")
# set suffix of generated DLL import library
set_target_properties(foo PROPERTIES IMPORT_SUFFIX ".lib")

可以通过设置以下目标属性来调整生成的共享库的名称:

# set base name of generated DLL shared library
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_NAME "bar")
# set prefix of generated DLL shared library
set_target_properties(foo PROPERTIES PREFIX "")
# set suffix of generated DLL shared library
set_target_properties(foo PROPERTIES SUFFIX ".dll")

查看CMake的源cmComputeLinkInformation.cxx,它只会在设置了CMAKE_IMPORT_LIBRARY_SUFFIX的情况下添加一个有效的/implib:...选项:

// Check whether we should use an import library for linking a target.
this->UseImportLibrary =
  this->Makefile->IsDefinitionSet("CMAKE_IMPORT_LIBRARY_SUFFIX");

因此,在以下测试中,导入库从我的可执行项目选项中删除:

cmake_minimum_required(VERSION 3.0)
project(NoImpLib CXX)
unset(CMAKE_IMPORT_LIBRARY_SUFFIX)
file(WRITE main.cpp "int main() { return 0; }")
add_executable(${PROJECT_NAME} main.cpp)

一个特定于VS的替代方案——因为该选项没有以其他方式/根据配置进行设置——将添加全局属性IgnoreImportLibrary,其中包含:

set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_IgnoreImportLibrary "true")

这个答案建议将/noimplib选项添加到target_link_options()应该可以防止生成导入库,但根据我的经验,它仍然会生成。

这封电子邮件的答案对我来说很有效;只需避免在install()命令中指定ARCHIVE DESTINATIONLIBRARY DESTINATION