为何cmath中定义的expint函数在Apple Clang编译时无法找到?
问题原因与解决办法
为什么std::expint找不到?
- C标准库从来没把
expint(也就是你说的对数积分函数对应的指数积分实现)纳入标准,它不属于标准C的内容。 - 你听说的
expint大多是GCC的libstdc库提供的GNU扩展,但Apple clang默认用的是libc标准库,这个库不支持这个GNU扩展——哪怕你指定gnu++17这类标准也没用,因为libc++不会为了兼容GNU去实现所有非标准扩展。
可行的解决办法
1. 用Boost库实现
Boost的Math模块有完整的指数积分实现,操作步骤:
- 先装Boost:M1 Mac直接用Homebrew执行
brew install boost - 修改代码如下:
#include <iostream> #include <boost/math/special_functions/expint.hpp> int main() { using namespace boost::math; std::cout << "Ei(0) = " << expint(0.0) << '\n' << "Ei(1) = " << expint(1.0) << '\n' << "Gompertz constant = " << -std::exp(1) * expint(-1.0) << '\n'; }
编译时要链接Boost库:clang++ -std=c++17 your_code.cpp -lboost_math
2. 换用GCC编译器
M1 Mac可以通过Homebrew装GCC:brew install gcc,之后用g++-13(具体版本看你装的是gcc13还是其他)编译你的原代码,记得加-std=gnu++17参数——GCC的libstdc++支持std::expint这个GNU扩展,能直接编译通过。
3. 手动实现或用其他轻量数学库
如果不想依赖Boost或GCC,也可以自己写指数积分的近似算法,或者用GSL(GNU科学库,brew install gsl安装),调用gsl_sf_expint_E1这类函数来实现需求。
内容的提问来源于stack exchange,提问作者João Viana
相关产品推荐
相关产品推荐

