由于多种原因,我必须通过自定义命令手动生成静态库。
但是,似乎自定义命令仅在目标专门请求其输出文件时执行。
如果我尝试将生成的静态库与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
调用之间以某种方式插入目标或依赖项,但我无法理解如何正确地执行此操作。
答案 0 :(得分:0)
为了保持可执行文件和库文件之间的依赖关系,您需要在链接它时使用完整路径到库文件:
target_link_libraries(my_exe ${CMAKE_CURRENT_BINARY_DIR}/mylib.a)
当使用相对路径时,CMake希望链接器找到库(根据其规则),因此在这种情况下CMake无法调整与库文件的依赖关系。
答案 1 :(得分:0)
我必须这样做才能调用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属性。
Refences: