CMake使用目标链接库添加自定义命令

CMake使用目标链接库添加自定义命令,cmake,dependencies,static-libraries,add-custom-command,Cmake,Dependencies,Static Libraries,Add Custom Command,出于许多原因,我必须通过自定义命令手动生成静态库 但是,似乎只有当目标明确请求其输出文件时,才会执行自定义命令 如果我试图将生成的静态库链接到目标链接库,CMake会抱怨说它找不到生成它的规则 # Building library on the fly add_custom_command(OUTPUT mylib.a COMMAND ... ) add_executable(myexe main.cpp)

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

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

如果我试图将生成的静态库链接到
目标链接库
,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_命令
调用和
target_link_库
调用之间插入一个目标或依赖项,但我无法理解如何正确执行。

要保留可执行文件和库文件之间的依赖项,与库文件链接时,需要使用库文件的完整路径:

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

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

我必须这样做才能调用MATLAB的RTW为自己构建DLL。我使用的函数是
add\u custom\u 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_custom_目标(MyLib ALL
评论“构建MyLib”
)
添加可执行文件(MyExe main.cpp)
目标链接库(MyExe MyLib)
如果这不起作用,我听说您可以使用
add_library()
创建一个虚拟库。然后,使用
set\u target\u properties()
为其创建接口属性

参考文献:


Hm,因此CMake只跟踪库文件中的更改,而不绑定到
add\u custom\u命令
。看起来您需要求助于导入的库目标,如前所述。顺便说一句,这个问题看起来和你的一样。是的,看起来是同一个问题,以前找不到。