如何防止CMake发布/ IMPLIB

时间:2016-01-03 09:30:58

标签: c++ cmake

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

2 个答案:

答案 0 :(得分:3)

查看CMake的来源cmComputeLinkInformation.cxx,如果设置/implib:...,则只会添加有效的CMAKE_IMPORT_LIBRARY_SUFFIX选项:

// 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")

答案 1 :(得分:1)

我认为不可能阻止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")