如何防止CMake发布/IIMPLIB
How to prevent CMake from issuing /IMPLIB
我有一个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 DESTINATION
和LIBRARY DESTINATION
。
相关文章:
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- c++方法参数只能在linux的发布模式下自行更改
- C++如何仅使用MOV在x86上实现发布和获取
- 发布旋转矩阵(openGL/glm)
- 小字符串优化(调试与发布模式)
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- fastrtps:如何在发布/订阅级别使用 DDS 历史记录?
- 在macOS Mojave上发布BOOST unit_test_framework/Google测试
- 发布消息:未收到消息
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 如何在Linux上正确发布C++软件(游戏)
- LinuxdeployQT 今天如何创建 Appimage,自 ubuntu 16.04 发布以来,它可以在每个 Lin
- 发布版本中的 Qt 隐形组合框(但不在调试版本中)
- RAII 等效于 FIFO 发布订单
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- 在函数中声明的 ifStream 对象在发布模式下不起作用
- 我应该如何获取配置文件的绝对路径与 Windows .exe一起发布?
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- 如何防止CMake发布/IIMPLIB