CMake add_custom_command 与 target_link_libraries

Sva*_*zen 6 dependencies cmake static-libraries cmake-custom-command

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

但是,似乎只有当目标明确请求其输出文件时才会执行自定义命令。

如果我尝试将生成的静态库与 链接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
Run Code Online (Sandbox Code Playgroud)

我想我必须在add_custom_command调用和target_link_libraries调用之间以某种方式插入目标或依赖项,但我无法理解如何正确执行此操作。

Tsy*_*rev 1

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

target_link_libraries(my_exe ${CMAKE_CURRENT_BINARY_DIR}/mylib.a)
Run Code Online (Sandbox Code Playgroud)

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

  • 嗯,所以 CMake 仅跟踪库文件中的更改,而不绑定到“add_custom_command”。看起来您需要求助于导入的库目标,如[这个问题](http://stackoverflow.com/questions/31274577/custom-target-as-a-target-library-in-cmake)中所述。顺便说一句,这个问题对你来说似乎是重复的。 (2认同)