使用Google GN构建Ninja文件时绝对路径触发无效令牌错误
解决GN构建Ninja文件时的无效令牌错误
兄弟,我之前在Windows下用GN构建的时候也踩过一模一样的绝对路径坑!你这个无效令牌错误就是因为GN不认/C:/这种格式的路径导致的,给你几个实用的解决办法:
1. 优先用相对路径(最推荐)
如果test.h是你项目内的文件,尽量改用相对于当前BUILD.gn文件的路径,比如假设test.h在项目根目录下,当前BUILD.gn在src/rtc_tools这样的子目录,那可以写成../../test.h。绝对路径会让项目失去可移植性,换台机器大概率还要改路径,能不用就不用。
2. 修正Windows绝对路径的格式
如果必须用绝对路径,GN在Windows下的正确格式是去掉开头的斜杠,也就是把/C:/改成C:/。GN会把开头的斜杠当成Unix系统的根目录,在Windows下直接识别成无效令牌。
修正后的GN代码示例:
rtc_executable("python_server") { testonly = true # 去掉开头的斜杠,修正绝对路径格式 include_dirs = ["C:/"] sources = [ "python_wrappers/main.cc", "C:/test.h", ] deps = [ "..:webrtc_common", "../rtc_base:rtc_base_approved", "../rtc_base:stringutils", "../rtc_tools:command_line_parser", ] if (!build_with_chromium && is_clang) { # 保留你原来的抑制Chromium Clang插件警告的代码 } }
3. 用GN变量管理路径(更专业的维护方式)
如果有多个地方用到同一个绝对路径,可以定义一个变量来统一管理,后续修改起来更方便:
# 定义根路径变量 project_root = "C:/" rtc_executable("python_server") { testonly = true include_dirs = [ project_root ] sources = [ "python_wrappers/main.cc", "${project_root}test.h", ] deps = [ "..:webrtc_common", "../rtc_base:rtc_base_approved", "../rtc_base:stringutils", "../rtc_tools:command_line_parser", ] if (!build_with_chromium && is_clang) { # 保留原警告抑制代码 } }
额外提醒
- 尽量避免在GN配置中硬编码绝对路径,尤其是团队协作的项目,绝对路径很容易导致构建失败。
- 如果是项目内的头文件,建议通过
include_dirs添加项目内的目录,然后在代码中用#include "test.h"引用,而不是在GN的sources里写绝对路径。
内容的提问来源于stack exchange,提问作者Master Splinter
相关产品推荐
相关产品推荐

