【问题标题】:CMake - Link against exe on WindowsCMake - 在 Windows 上链接 exe
【发布时间】:2018-10-23 00:39:55
【问题描述】:

我正在尝试为我的应用程序创建一个插件系统,因此每个插件都需要与我的主应用程序链接。这在 Linux 和 macOS 上很好,因为我可以设置我的可执行目标 (set_target_properties(${PROJECT_NAME} PROPERTIES ENABLE_EXPORTS 1) 的 ENABLE_EXPORTS 属性,插件就会很好地链接。然而,在 Windows 上,clang++ 对我大喊它找不到 libws2editor.dll.a

clang++.exe: error: no such file or directory: 'ws2editor/libws2editor.dll.a'

在查看 CMake 文档时,它显示“对于 DLL 平台,将为导出的符号创建一个导入库,然后用于链接。” - 这个导入库文件(大概是 .dll.a)似乎永远不会被创建。

那么我怎样才能让 CMake 在 Windows 上构建来创建这个文件,或者以其他方式与可执行文件链接?

【问题讨论】:

  • 将插件与主应用程序链接是什么意思?据我所知,要为您的应用程序提供插件,您应该在您的应用程序(您的主要可执行文件)中声明一些接口并在您的插件中实现它。
  • 您是否在主可执行文件上设置了 ENABLE_EXPORTS 属性?
  • @wxShayan 是的,我确实在主 exe 上设置了 ENABLE_EXPORTS。我的意思也正是我说“链接到 exe”时所说的,我的插件有 target_link_libraries(${PROJECT_NAME} ws2editor)
  • 经过一番挖掘后,我遇到了github.com/Kitware/CMake/blob/master/Tests/Plugin/… - 当我克隆 CMake 存储库并尝试自己编译该测试时,使用 clang + ninja 时它也会失败并出现同样的错误!当使用 MSVC/msbuild 构建时,它编译得很好(但是,我的项目在为 MSVC 生成文件时无法配置,理想情况下我想在 Win/Mac/Linux 上使用相同的构建配置)。

标签: c++ windows build cmake linker


【解决方案1】:

看起来我可以使用ar 为我生成 .a 文件,而不管生成器如何 - 执行此操作时插件似乎链接和加载都很好。惊人的! :)

if(WIN32)
    #Invoke ar to generate a .dll.a from the .obj files, required to link plugins
    add_custom_command(TARGET ${PROJECT_NAME} PRE_LINK
        COMMAND sh -c "${CMAKE_AR} cr lib${PROJECT_NAME}.dll.a $$(find . -name '*.obj' -printf '%p ')"
        COMMENT "Generating lib${PROJECT_NAME}.dll.a for external linking"
        )

    #Also add the install command for libws2editor.dll.a
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.dll.a DESTINATION bin)
endif(WIN32)

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2020-07-13
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多