add_custom_target 用来创建一个自定义的 target。

其使用方式一般如下:

add_custom_target(
    libgogolib # target name
    ALL # 是否包含到 ALL target 中
    COMMAND go build -buildmode=c-shared -o "${PROJECT_BINARY_DIR}/autogen/libgogolib.so" # 执行命令
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/golib"
    BYPRODUCTS "gogolib" # 指明生成的文件。CMake 不会检查此文件是否存在
)

add_library(cus_lib lib.cpp)
add_dependencies(cus_lib libgogolib) # 指明 target 的依赖

target_link_directories(cus_lib PRIVATE "${PROJECT_BINARY_DIR}/autogen")
target_include_directories(cus_lib PRIVATE "${PROJECT_BINARY_DIR}/autogen/")
target_link_libraries(cus_lib PRIVATE "${PROJECT_BINARY_DIR}/autogen/gogolib.so") # 链接库

使用外部工具构建库

一个常见的需求是使用外部工具构建库,然后通过 INTERFACE 库导入到 CMake 中。一个自然的选择是组合使用 add_custom_targetadd_library(xxx INTERFACE)。然而由于 INTERFACE 库实际上不会构建任何内容,因此上面的办法是行不通的。[1]

可行的方式为组合使用 add_custom_target, add_custom_commandadd_library(xxx INTERFACE)

set(BASE_DIR ../../../../)
file(REAL_PATH ${BASE_DIR} BASE_DIR)

set(MY_LIB ${BASE_DIR}/target/debug/libxxx.a)
add_custom_command(
    OUTPUT ${MY_LIB} (1)
    COMMAND cargo rustc --crate-type staticlib --manifest-path ${BASE_DIR}/xxx/Cargo.toml
    WORKING_DIRECTORY ${BASE_DIR}
)

add_custom_target(
    build_xxx
    VERBATIM
    DEPENDS ${MY_LIB} (2)
)

add_library(mylib INTERFACE)
target_link_libraries(mylib INTERFACE ${MY_LIB})
add_dependencies(mylib build_xxx) (3)
  1. 告诉 CMake 那里去找 libxxx.a。

  2. 让 build_xxx 去执行 add_custom_command。

  3. 让 mylib 执行 build_xxx。

Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx