Windows下CodeBlocks使用Boost Filesystem遇未定义引用错误求助
解决CodeBlocks+MinGW-w64下Boost Filesystem的undefined reference错误
我之前踩过一模一样的坑,结合你的配置情况,咱们一步步排查解决:
1. 先搞定32/64位架构的匹配问题
你同时添加了x32和x64的Boost库,这绝对是冲突的根源!CodeBlocks的MinGW-w64环境只能是32位或64位其中一种,不能混加:
- 打开CodeBlocks,点击顶部菜单栏的
Project->Build options; - 切换到
Compiler settings标签,查看编译器参数里有没有-m32(32位)或-m64(64位); - 只保留对应架构的Boost库,删掉另一个架构的文件。比如你的项目是64位,就删掉
libboost_system-mgw73-mt-d-x32-1_66.a,只留x64系列的库。
2. 匹配调试/发布模式的库类型
Boost库的命名是有规则的,-d后缀代表调试版本,没有-d的是发布版本,必须和你的项目当前模式对应:
- 如果是调试模式(CodeBlocks工具栏选的是Debug):要添加带
-d的库,比如libboost_filesystem-mgw73-mt-d-x64-1_66.a和libboost_system-mgw73-mt-d-x64-1_66.a(你现在加的filesystem库是不带-d的.dll.a,调试模式下会不兼容); - 如果是发布模式(选的是Release):用不带
-d的库,比如libboost_filesystem-mgw73-mt-x64-1_66.dll.a和libboost_system-mgw73-mt-x64-1_66.a。
另外补充:.dll.a是动态链接的导入库,如果你的项目是静态链接Boost,要选不带.dll.a的纯.a文件,这取决于你编译Boost时的配置。
3. 调整链接顺序
Boost Filesystem依赖Boost System库,链接时必须把libboost_filesystem放在libboost_system前面,顺序反了就会出现未定义引用的错误。
4. 确认Boost库的编译参数匹配
你用的是MinGW-w64的mgw73版本,要确保你下载/编译的Boost库是用同版本MinGW-w64编译的:
- 库名里的
-mt代表多线程模式,要确认你的项目也开启了多线程:在Build options->Compiler settings->#defines里,检查是否有_MT或_REENTRANT宏定义,如果没有就加上。
附:完整测试代码
确保你的代码是完整可编译的,比如:
#include <iostream> #include <boost/filesystem.hpp> using namespace std; namespace fs = boost::filesystem; int main(int argc, char* argv[]) { if (argc < 2) { cout << "请传入一个路径作为参数" << endl; return 1; } fs::path target_path(argv[1]); if (fs::is_directory(target_path)) { cout << target_path << " 是一个目录" << endl; } else if (fs::is_regular_file(target_path)) { cout << target_path << " 是一个普通文件" << endl; } else { cout << target_path << " 不是有效的文件/目录" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者JavScars
相关产品推荐
相关产品推荐

