使用std::bitset的set函数时出现入口点找不到错误的求助
看起来你遇到的这个无法在动态链接库中找到过程入口点_ZSt24__throw_out_of_range_fmtPKcz错误,本质上是GCC标准库(libstdc++)的编译与运行版本不匹配导致的,和你的option变量初始化完全无关——你的代码里option4=4,而std::bitset<8>的合法索引是0到7,调用bits.set(option4)根本不会触发越界,所以排除代码逻辑问题。
问题根源
_ZSt24__throw_out_of_range_fmtPKcz是GCC较新版本(大概GCC 5+)的libstdc中新增的格式化异常抛出函数。如果你用新版本的GCC编译代码,但运行时系统加载了旧版本的libstdc动态库,就会出现这个入口点找不到的错误。Windows环境下GCC的标准库默认是动态链接的,很容易出现这种版本冲突。
具体解决方案
这里有几个靠谱的解决办法,按优先级推荐:
静态链接标准库
编译代码时加上-static-libstdc++参数,强制把libstdc++静态链接到可执行文件里,这样就不会依赖系统中的动态库了。比如你的编译命令可以改成:g++ -std=c++14 -static-libstdc++ your_code.cpp -o your_program.exe这个方法最直接,能彻底避免动态库版本冲突的问题。
统一GCC编译与运行环境
检查你的系统中是否安装了多个版本的GCC,确保编译和运行时使用的是同一个版本的GCC及其配套的libstdc++。比如你可以通过以下命令确认当前使用的GCC版本:g++ --version然后确保运行程序时,系统优先找到该版本GCC的bin目录下的动态库(可以把GCC的bin路径加到系统环境变量PATH的最前面)。
确认编译参数的一致性
确保你编译时指定的C++标准(-std=c++14)和编译器对标准库的实现是匹配的,不要混合使用不同标准的编译选项。
验证你的代码
顺便说一句,你的代码逻辑是完全没问题的——std::bitset<8> bits(0x2)初始化后是00000010,调用bits.set(4)后会变成00010010,这部分完全符合预期。移除set函数后程序能运行,只是因为没触发那个需要调用新版本库函数的代码路径而已。
内容的提问来源于stack exchange,提问作者Alvin FREY

