如何用Chromium GN工具创建独立及依赖Chromium子项目的工程?
我之前也碰到过这个gn.py: Could not find checkout in any parent of the current path错误,本质是depot_tools里的GN脚本默认会向上遍历目录寻找Chromium仓库的根目录(带.git标识的目录),下面分两种场景给你详细解决:
这种场景下不需要依赖任何Chromium代码,只需要用GN做简单的C++构建,步骤如下:
新建一个空目录并进入:
mkdir hello_gn && cd hello_gn编写源文件
hello.cc:#include <iostream> int main() { std::cout << "Hello World from GN!" << std::endl; return 0; }编写GN构建配置文件
BUILD.gn:executable("hello") { sources = [ "hello.cc" ] # 可选:指定C++标准,比如C++17 cflags_cc = [ "-std=c++17" ] }生成构建目录,关键是加上
--no-checkout参数,告诉GN不要寻找Chromium仓库:gn gen --no-checkout out/Default用ninja构建并运行:
ninja -C out/Default hello ./out/Default/hello
运行后就能看到"Hello World from GN!"的输出了,这个工程完全独立,和Chromium没有任何关联。
如果要依赖pdfium、v8这类Chromium子项目,必须先拥有完整的Chromium代码 checkout,步骤如下:
首先用depot_tools同步Chromium代码(会自动包含pdfium等子项目):
mkdir chromium_checkout && cd chromium_checkout fetch chromium cd src在
src目录下新建你的工程目录,比如pdf_page_counter并进入:mkdir pdf_page_counter && cd pdf_page_counter编写调用pdfium的源文件
pdf_counter.cc:#include <iostream> #include "pdfium/fpdfview.h" int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " <pdf_file>" << std::endl; return 1; } // 初始化PDFium库 FPDF_InitLibrary(); // 加载目标PDF文件 FPDF_DOCUMENT doc = FPDF_LoadDocument(argv[1], nullptr); if (!doc) { std::cerr << "Failed to load PDF file!" << std::endl; FPDF_DestroyLibrary(); return 1; } // 获取PDF页数 int page_count = FPDF_GetPageCount(doc); std::cout << "PDF page count: " << page_count << std::endl; // 清理资源 FPDF_CloseDocument(doc); FPDF_DestroyLibrary(); return 0; }编写GN构建配置文件
BUILD.gn,指定依赖pdfium:executable("pdf_page_counter") { sources = [ "pdf_counter.cc" ] // 依赖Chromium的pdfium库目标 deps = [ "//third_party/pdfium:pdfium" ] cflags_cc = [ "-std=c++17" ] }回到
src目录,生成构建目录(此时GN会自动识别Chromium仓库根目录,不会报错):cd ../ gn gen out/Default用ninja构建你的目标并测试:
ninja -C out/Default pdf_page_counter ./out/Default/pdf_page_counter your_test.pdf
这样就能得到一个可以读取PDF页数的控制台程序,其他Chromium子项目(比如v8)的依赖方式类似,只需要修改BUILD.gn里的deps路径即可。
内容的提问来源于stack exchange,提问作者Centny

