【问题标题】:CMake: Generate import library from definition fileCMake:从定义文件生成导入库
【发布时间】:2019-12-02 21:30:08
【问题描述】:

我正在使用 CMake 为 MSVC 构建一个项目。

我只有一个 .def 文件,其中包含从 dll 库中导出的函数。我的项目无权访问 dll 或源代码。而且我需要一个导入库来消除未解决的外部问题。我正在为其构建项目的 SDK 仅使用头文件和导入库。但是有些库没有构建,所以我必须在没有源代码或 DLL 库的情况下单独构建它们(它们与产品一起打包,而不是 SDK)。

我可以使用以下命令构建一个导入库,我将它用作 VS 项目中的预链接事件:

lib /def:<def path> /OUT:<lib name> /MACHINE:<machine type>

CMake 也有办法吗? 我试过这样的命令:

add_library(Ilib STATIC empty.cpp expfile.def)
add_library(Ilib SHARED empty.cpp expfile.def)
add_library(Ilib STATIC expfile.def)
set_target_properties(Ilib PROPERTIES LINKER_LANGUAGE CXX)

但它们都不起作用。

我认为,唯一的解决方案是创建一个execute_processadd_custom_command 命令。

【问题讨论】:

  • 你看到this question的这个答案了吗?这些似乎专注于出口,但可能会有所帮助。另外,还有一篇文章的链接here
  • 谢谢小猫们,我都读过它们,它们专注于从构建的 .dll 或 tagets 生成 .def 文件。但我见过add_custom_command。在最坏的情况下,我可以将预链接事件放入生成的项目中。

标签: visual-c++ dll cmake import-libraries


【解决方案1】:

当我昨晚搜索此帖子时,此帖子是热门搜索结果,但我找不到任何有用的信息。如果它对某人有用(或将来我再次寻找它),这就是我最终的结果:

(假设 def 文件在 CMakeLists.txt 旁边)

project(msvcrt)

add_custom_command(
  OUTPUT msvcrt.lib
  COMMAND lib.exe /machine:X64 /def:${CMAKE_CURRENT_SOURCE_DIR}/msvcrt.def /out:msvcrt.lib
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/msvcrt.def
  VERBATIM)

add_custom_target(msvcrtlib ALL
    DEPENDS msvcrt.lib
    VERBATIM)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/msvcrt.lib DESTINATION foobar)

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多