如何基于QBS构建系统实现C文件编译、转储及头文件复用
基于QBS实现编译.o、生成xxd头文件并在库中引用的方案
下面是对应三个需求的具体实现,包含完整的QBS项目配置代码:
1. 编译.c文件生成.o目标文件
在QBS里可以直接用object类型的Product来单独编译.c文件为目标文件,也可以在库/应用产品中附带生成。示例:
Product { type: "object" name: "myObject" files: "src/myfile.c" // 替换成你的.c文件路径 cpp.cFlags: ["-Wall", "-O2"] // 可选:添加编译警告、优化等参数 }
设置type: "object"后,QBS会自动编译指定的.c文件,输出对应的myfile.o。
2. 用xxd处理.o生成.h头文件
通过CustomRule调用xxd命令,注意要依赖前面生成的.o产品,保证执行顺序正确:
Product { name: "objectToHeader" dependencies: ["myObject"] // 依赖第一步的目标文件产品 Rule { inputs: ["object"] // 输入为第一步生成的.o文件 outputFileTags: ["hpp"] // 标记输出为头文件类型 outputFileName: input.baseName + ".h" // 输出文件名和.o同名,后缀改为.h prepare: { // xxd -i 参数会把二进制文件转为C语言数组定义的头文件 var xxdCmd = new Command("xxd", ["-i", input.filePath, output.filePath]); xxdCmd.description = "Generating header from " + input.fileName; xxdCmd.highlight = "codegen"; return xxdCmd; } } }
3. 在C/C++库中引用生成的头文件
创建静态/动态库产品,依赖第二步的头文件生成产品,并将头文件所在目录加入包含路径:
CppStaticLibrary { name: "myLibrary" files: "src/library.c" // 你的库源文件 dependencies: ["objectToHeader"] // 将生成的头文件目录加入include路径,这样代码里就能直接#include cpp.includePaths: [product.buildDirectory + "/objectToHeader"] }
之后在library.c里就可以用#include "myfile.h"来使用xxd生成的数组了。
完整整合的QBS项目示例
import qbs Project { // 步骤1:编译.c为.o Product { type: "object" name: "myObject" files: "src/myfile.c" cpp.cFlags: ["-Wall", "-O2"] } // 步骤2:xxd转换.o为.h Product { name: "objectToHeader" dependencies: ["myObject"] Rule { inputs: ["object"] outputFileTags: ["hpp"] outputFileName: input.baseName + ".h" prepare: { var xxdCmd = new Command("xxd", ["-i", input.filePath, output.filePath]); xxdCmd.description = "xxd: converting " + input.fileName + " to header"; xxdCmd.highlight = "codegen"; return xxdCmd; } } } // 步骤3:构建库并引用头文件 CppStaticLibrary { name: "myLibrary" files: "src/library.c" dependencies: ["objectToHeader"] cpp.includePaths: [product.buildDirectory + "/objectToHeader"] } }
注意事项
- 确保系统已安装xxd工具(通常随vim包一起安装);
- 根据你的项目目录结构调整
src/等路径; - 如果需要动态库,将
CppStaticLibrary替换为CppDynamicLibrary即可。
内容的提问来源于stack exchange,提问作者Flaviu
相关产品推荐
相关产品推荐

