GN构建中如何为指定文件单独覆盖编译/链接选项?
GN构建:单独为文件设置编译选项及source_set相关问题
一、仅为特定文件覆盖编译选项(生成预处理代码)
如果只想查看File123.cpp的预处理结果,同时避免重复全局构建配置,可以通过复用全局配置+单独创建预处理目标的方式实现,不用重复整个构建步骤:
- 先把全局通用的编译配置抽成独立
config节点,方便复用:
config("global_build_config") { cflags = [ "-Wall", "-O2" ] # 替换成你的全局编译标志 include_dirs = [ "../include", "src/common" ] # 全局头文件路径 defines = [ "PROJECT_VERSION=\"1.0\"" ] # 全局宏定义 }
- 主目标正常引用这个配置:
executable("main_app") { sources = [ "File123.cpp", "other_file.cpp", "utils.cc" ] configs = [ ":global_build_config" ] }
- 创建单独的预处理目标,复用全局配置,只处理
File123.cpp:
action("preprocess_file123") { sources = [ "File123.cpp" ] # 指定预处理输出文件路径 outputs = [ "$target_gen_dir/File123.i" ] # 调用编译器执行预处理,自动继承config里的所有参数 cmd = "$cxx $cflags $defines $include_dirs -E -o $outputs $sources" # 复用全局配置,无需重复写所有编译参数 configs = [ ":global_build_config" ] }
执行gn gen后,通过ninja preprocess_file123就能生成预处理后的File123.i文件。
如果只是临时给单个文件修改编译标志(不影响主目标),也可以用set_source_files_properties,但注意-E会让该文件仅预处理不生成目标代码,可能导致主目标链接失败,所以仅适合临时调试:
executable("main_app") { sources = [ "File123.cpp", "other_file.cpp" ] configs = [ ":global_build_config" ] # 仅为File123.cpp添加-E选项 set_source_files_properties("File123.cpp", { cflags = [ "-E" ] }) }
二、source_set对C++文件的支持
source_set完全支持C文件(.cpp、.cc、.cxx等后缀),它是GN中用于组织一组源文件的轻量目标类型,本质上会生成平台相关的中间库(比如Linux下的静态库、Windows下的.obj集合),可以直接包含C代码,用法和executable、static_library一致:
source_set("core_logic") { sources = [ "core.cpp", "utils.cc", "data_processor.cpp" ] configs = [ ":global_build_config" ] } # 在主目标中引用该source_set executable("main_app") { deps = [ ":core_logic" ] sources = [ "main.cpp" ] }
内容的提问来源于stack exchange,提问作者Agnel Kurian
相关产品推荐
相关产品推荐

