如何在CMakeLists中为特定目录添加-fpermissive编译选项
解决方案
问题根源在于-fpermissive是GCC C++编译器专属选项,对处理.c文件的C编译器无效。直接全局调用add_compile_options(-fpermissive)会将选项同时传给C和C++编译器,但C编译器会忽略该选项,导致你需要的效果没生效。以下是几种可行的针对性解决方法:
方法1:仅给C++源文件添加-fpermissive
通过set_source_files_properties指定仅对C++代码应用该选项:
idf_component_register(SRCS "parser.cpp" "protobuf-c/timestamp.pb-c.c" "protobuf-c/units.pb-c.c" "protobuf-c/configuration.pb-c.c" INCLUDE_DIRS "." "include" "protobuf-h" REQUIRES protobuf-c ) # 仅对C++源文件添加-fpermissive set_source_files_properties(parser.cpp PROPERTIES COMPILE_OPTIONS "-fpermissive")
方法2:显式指定C文件用C编译器编译(避免被误当作C++处理)
如果你的.c文件被错误地用C编译器编译(比如项目默认启用CXX模式),可以强制指定这些文件的编译语言为C,同时给C文件添加选项:
idf_component_register(SRCS "parser.cpp" "protobuf-c/timestamp.pb-c.c" "protobuf-c/units.pb-c.c" "protobuf-c/configuration.pb-c.c" INCLUDE_DIRS "." "include" "protobuf-h" REQUIRES protobuf-c ) # 指定所有proto-c生成的.c文件使用C编译器编译 set_source_files_properties( protobuf-c/timestamp.pb-c.c protobuf-c/units.pb-c.c protobuf-c/configuration.pb-c.c PROPERTIES LANGUAGE C ) # 给C++源文件添加-fpermissive set_source_files_properties(parser.cpp PROPERTIES COMPILE_OPTIONS "-fpermissive")
方法3:基于编译语言自动应用选项(最优雅)
利用CMake的编译语言条件判断,仅对C++编译过程添加-fpermissive,ESP-IDF组件的目标变量为${COMPONENT_LIB}:
idf_component_register(SRCS "parser.cpp" "protobuf-c/timestamp.pb-c.c" "protobuf-c/units.pb-c.c" "protobuf-c/configuration.pb-c.c" INCLUDE_DIRS "." "include" "protobuf-h" REQUIRES protobuf-c ) # 自动识别编译语言,仅对C++代码应用-fpermissive target_compile_options(${COMPONENT_LIB} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fpermissive>)
额外建议
先查看具体报错信息,确认是C++编译阶段的问题还是C编译阶段的问题:
- 如果是C编译报错,
-fpermissive完全无效,需要排查proto-c生成代码的语法问题,或添加C编译器的兼容选项 - 如果是C++编译时引用C头文件导致的兼容性问题,上述方法可以解决
内容的提问来源于stack exchange,提问作者Mbded
相关产品推荐
相关产品推荐

