CMake常见示例
- 基本用法
# 1. 定义原型动态库(前置条件) add_library(opgraph_math SHARED ) # 2. 生成ES API包(库+wheel包) add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 3. 在应用中使用 add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE es_math)如果工程中还有在编译阶段就需要ES头文件的OBJECT/STATIC中间目标,可额外添加add_dependencies(<中间目标> build_es_math)(build_es_*** 名称会随包名变化),以确保在编译该目标前已完成代码生成。最终的可执行或共享库只需target_link_libraries(... es_math) 即可自动触发相关依赖,示例如下:
add_library(my_obj OBJECT foo.cc bar.cc) # 保证编译对象前先生成es_math头文件(推荐显式添加) add_dependencies(my_obj build_es_math) # 传递头文件搜索路径的作用 target_link_libraries(my_obj PRIVATE es_math) add_executable(my_app $<TARGET_OBJECTS:my_obj>) target_link_libraries(my_app PRIVATE es_math ) - 只生成C/C++ 库
# 只生成 C/C++ 库(跳过Python wheel包) add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) - 排除部分算子生成
# 生成math TARGET # 生成产物不会包含es_Add_c.h; es_Add.h, es_Add.cpp, es_Add.py add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output EXCLUDE_OPS Add ) - 多个TARGET
# 生成math TARGET add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 生成nn TARGET add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_nn OPP_PROTO_TARGET opgraph_nn OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 使用多个TARGET add_executable(my_inference_app main.cpp) target_link_libraries(my_inference_app PRIVATE es_math es_nn ) - 多个TARGET共享输出目录:所有TARGET可以使用同一个OUTPUT_PATH,头文件会按包名组织在子目录中,示例如下:
add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output # 共享路径 ) add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_nn OPP_PROTO_TARGET opgraph_nn OUTPUT_PATH ${CMAKE_BINARY_DIR}/output # 共享路径 ) # 输出结构: # output/ # ├── include/ # │ ├── es_math/ # │ └── es_nn/ # ├── lib64/ # │ ├── libes_math.so # │ └── libes_nn.so # └── whl/ # ├── es_math-1.0.0-py3-none-any.whl # └── es_nn-1.0.0-py3-none-any.whl
父主题: 附录