cmkr目标类型实战:executable、static、shared、interface与object库完全对比
cmkr目标类型实战executable、static、shared、interface与object库完全对比【免费下载链接】cmkrModern build system based on CMake and TOML.项目地址: https://gitcode.com/gh_mirrors/cm/cmkrcmkr 是一款基于 CMake 与 TOML 的现代化 C 构建系统通过解析cmake.toml自动生成规范的CMakeLists.txt。本文带你完整掌握 cmkr 的五种目标类型——executable可执行程序、static静态库、shared动态库、interface纯头文件库与 object对象库帮你在 10 分钟内选对类型、少走弯路。目标类型是什么cmkr 的一次快速认识在 cmkr 中每个[target.xxx]段都代表一个构建目标而type字段决定了它的本质是生成可执行程序还是静态库、动态库、纯头文件库或对象库。五种常用类型在项目源码 include/project_parser.hpp 中被集中定义生成逻辑则位于 src/cmake_generator.cppexecutable映射为 CMake 的add_executableshared、static、interface、object统一映射为add_library只是附加的库类型关键字不同 ️一个最小工程只需几行 TOML[project] name hello_world [target.hello_world] type executable sources [src/main.cpp]配置好 cmkr 后每次修改cmake.toml重新构建时 CMake 列表会自动重新生成无需任何额外步骤。项目根目录的 cmake.toml 就是它构建自身的完整示例。executable打造可执行程序的最常用类型executable是绝大多数项目的起点——它把源文件编译并链接成一个可执行文件。官方测试工程 tests/basic/cmake.toml 展示了最精简的写法[target.basic] type executable sources [src/basic.cpp]它等价于 CMake 中的add_executable(basic src/basic.cpp)。需要特别注意executable 的可见性默认是PRIVATE即编译选项、头文件路径等属性不会传染给其他目标这正符合程序是最终产物的直觉。另外cmkr 命令行提供了脚手架命令可一键初始化工程cmkr init executable也支持library、shared、static、interface模板新手可以快速获得一个标准目录结构。static静态库——把代码打包给别人链接静态库把编译产物打成一个归档文件在使用方链接时直接摊平进最终程序运行时不依赖额外的库文件。测试工程 tests/globbing/cmake.toml 给出了典型用法[target.mylib] type static alias mylib::mylib sources [mylib/**.hpp, mylib/**.cpp] include-directories [mylib/include] [target.example] type executable sources [example/src/*.cpp] link-libraries [mylib::mylib]两个亮点值得学习通配符收集源文件mylib/**.cpp递归匹配且由 cmkr 在生成时展开、排序结果跨平台确定性一致alias 命名空间mylib::mylib生成 CMake 的 ALIAS 目标让链接方使用mylib::mylib这种带命名空间的现代写法避免全局命名冲突 static 目标默认PUBLIC可见性它声明的编译定义、包含目录会自动传递给所有链接它的目标——这正是静态库头文件要跟着走的特性。shared动态库DLL/so——运行时共享的编译产物shared生成动态链接库Windows 上的 DLL、Linux 上的.so、macOS 上的.dylib。它的 TOML 写法与 static 几乎相同只把type换成shared[target.myplugin] type shared sources [src/plugin.cpp] include-directories [include]静态库与动态库怎么选维度staticshared体积每个使用方各带一份代码多进程共享一份更新需重新链接所有使用方替换库文件即可部署零额外依赖需随程序分发库文件适用内部组件、嵌入式插件系统、需要热更新的模块cmkr 还支持通过alias为动态库添加命名空间写法与 static 完全一致。interface纯头文件库——零编译成本的轻量方案interface目标不编译任何代码只负责转发头文件路径和编译需求是 header-only 库的最佳载体。官方测试工程 tests/interface/cmake.toml 是教科书级示范[target.mylib] type interface include-directories [include] compile-features [cxx_std_11] [target.example] type executable sources [src/main.cpp] link-libraries [mylib]它生成 CMake 的add_library(mylib INTERFACE)。关键区别在于interface 目标的sources、包含目录、编译特性全部以INTERFACE可见性作用于使用方——即我只规定你怎么用我我不自己干活。cmkr 项目自身就在用这种方式cmake.toml 中的cmkr_generate_documentation目标就是一个 interface 目标用来挂载文档生成的自定义逻辑。object对象库——只编译、不归档、不链接的中间产物object是五种类型中最特殊的一种它只把源文件编译成.o/.obj对象文件集合不生成库文件、也不做链接。适合的场景同一组源码需要同时编进静态库和动态库避免重复编译需要在多个目标间共享编译产物但又不想引入链接依赖跨目标共享预编译的重型代码如模板密集型库⚡写法上它和 static 类似仅类型关键字不同[target.core_objects] type object sources [core/*.cpp]在 CMake 中对应add_library(core_objects OBJECT)其他目标可通过target_sources引用其对象文件。一图看懂五种目标类型完全对比类型CMake 命令产物默认可见性典型场景executableadd_executable可执行文件PRIVATE应用程序、命令行工具staticadd_library STATIC静态库归档PUBLIC内部组件、零依赖分发sharedadd_library SHARED动态库DLL/soPUBLIC插件、多模块共享interfaceadd_library INTERFACE无仅属性转发INTERFACE纯头文件库objectadd_library OBJECT对象文件集合PUBLIC多目标复用编译产物选型的快速决策路径 要生成能运行的程序→executable只有头文件、没有 .cpp→interface需要打包给多个目标复用代码希望零运行时依赖 →static希望独立更新、多进程共享 →shared只需要共享对象文件 →object从入门到精通延伸学习路径完整选项参考cmake.toml各字段的权威说明见 docs/cmake-toml.md其中包含可见性规则、条件编译condition、vcpkg 集成等高级特性动手示例tests/ 目录下每个子目录都是一个可独立构建的迷你工程覆盖 basic、interface、globbing、cxx-standard、vcpkg 等场景配合 tests/CMakeLists.txt 可直接运行验证自定义目标类型cmkr 还支持 template 机制让你把常用配置沉淀为自己的目标模板进一步减少重复声明。掌握这五种目标类型你就掌握了 cmkr 表达构建什么、如何复用的核心语言。建议从executable起步逐步尝试用interface和static拆分你的第一个多目标工程——当cmake.toml从十几行长到上百行时你会发现 TOML 的表结构让目标管理依然井井有条。【免费下载链接】cmkrModern build system based on CMake and TOML.项目地址: https://gitcode.com/gh_mirrors/cm/cmkr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考