MacOS下g++-11编译Folly代码报fmt未声明错误问题咨询
报错根因
这个报错和你写的测试逻辑代码无关,两个核心诱因:
- 你使用的编译命令缺失大量必要参数,既没有指定Folly、其依赖的fmt库、gtest库的头文件搜索路径、库文件搜索路径与链接选项,也没有指定C++17及以上的语言标准(新版本Folly强制要求C++17/20编译标准,低版本标准无法通过编译)
- 部分版本Folly的
FBString.h中对fmt库的formatter特化逻辑没有做兼容保护,当编译器没有提前识别到fmt库的命名空间时,就会直接抛出*'fmt' has not been declared*的错误。
修复方案
- 调整头文件引入顺序,在所有Folly头文件之前优先引入fmt核心头文件,修改后代码开头部分如下:
#include <fmt/format.h> #include <folly/executors/ExecutorWithPriority.h> #include <folly/executors/CPUThreadPoolExecutor.h> #include <folly/futures/Future.h> #include <folly/portability/GTest.h> using namespace folly; // 后续原有逻辑保持不变即可 - 替换原有简陋的编译命令,补全所有必要参数。注意将命令中的路径替换为你本机实际的依赖安装路径:
g++-11 folly.cpp -std=c++17 \ -I/Users/tannyxie/Documents/Project Preparation/github/folly_include/installed/folly/include \ -L/Users/tannyxie/Documents/Project Preparation/github/folly_include/installed/folly/lib \ -lfolly -lfmt -lgtest -lpthread -ldl \ -o folly_test如果你是通过Homebrew安装的fmt、gtest依赖:Apple Silicon芯片Mac的默认依赖路径为
/opt/homebrew/下的include和lib目录,Intel芯片Mac的默认依赖路径为/usr/local/下的include和lib目录,编译器会默认搜索这两个路径,不需要额外添加-I和-L指定。 - 如果按上述步骤修改后仍然报错,检查本地安装的fmt版本是否和Folly版本匹配:2023年之后发布的Folly版本要求fmt版本不低于8.1.0,版本差过大会出现命名空间、接口不兼容的问题。
内容的提问来源于stack exchange,提问作者Tianyi Xie
相关产品推荐
相关产品推荐

