【问题标题】:CMake add_custom_command with target_link_librariesCMake add_custom_command 与 target_link_libraries
【发布时间】:2017-05-24 04:25:47
【问题描述】:

出于多种原因,我必须通过自定义命令手动生成静态库。

然而,自定义命令似乎只在 target 专门请求其输出文件时才执行。

如果我尝试将生成的静态库与target_link_libraries 链接,CMake 会抱怨它找不到生成它的规则。

# Building library on the fly
add_custom_command(OUTPUT mylib.a
    COMMAND ...
)
add_executable(myexe main.cpp)                                                                                                                                                     
target_link_libraries(myexe mylib.a) # Fails miserably

我想我必须以某种方式在 add_custom_command 调用和 target_link_libraries 调用之间插入一个目标或依赖项,但我不明白如何正确地这样做。

【问题讨论】:

    标签: cmake dependencies static-libraries cmake-custom-command


    【解决方案1】:

    为了保留可执行文件和库文件之间的依赖关系,您需要在链接库文件时使用完整路径

    target_link_libraries(my_exe ${CMAKE_CURRENT_BINARY_DIR}/mylib.a)
    

    当使用相对路径时,CMake 期望链接器找到库(根据其规则),因此在这种情况下,CMake 无法调整与库文件的依赖关系..

    【讨论】:

    • 嗯,所以 CMake 只跟踪库文件中的更改而不绑定到 add_custom_command。看起来您需要使用 IMPORTED 库目标,如 in this question 所述。顺便说一句,这个问题对你来说似乎是重复的。
    • 是的,好像是同一个问题,之前没找到。
    【解决方案2】:

    我必须这样做才能调用 MATLAB 的 RTW 来为我构建 DLL。我使用的函数是add_custom_target

    add_custom_target(Name [ALL] [command1 [args1...]]
                      [COMMAND command2 [args2...] ...]
                      [DEPENDS depend depend depend ... ]
                      [BYPRODUCTS [files...]]
                      [WORKING_DIRECTORY dir]
                      [COMMENT comment]
                      [VERBATIM] [USES_TERMINAL]
                      [COMMAND_EXPAND_LISTS]
                      [SOURCES src1 [src2...]])
    

    对你来说,它可能看起来像这样:

    add_custom_target(MyLib ALL 
                      <Put your command here>
                      COMMENT "Building MyLib"
                      )
    add_executable(MyExe main.cpp)
    target_link_libraries(MyExe MyLib)
    

    如果这不起作用,我听说您可以使用add_library() 创建一个虚拟库。然后,使用set_target_properties() 为其创建一个 INTERFACE 属性。

    参考:

    add_custom_target

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      相关资源
      最近更新 更多