我在这里问这个问题,因为我认为,它与 Linux 的关系比与 boost 本身的关系更大。
所以我创建了一个小的cpp文件:
#include <boost/math/special_functions/round.hpp>
#include <iostream>
int main(int argc, char **argv)
{
std::cout << "Start rounding ..." << std::endl;
double b = boost::math::round(1.5);
std::cout << "Rounding of 1.5: " << b << std::endl;
return 0;
}
现在我开始编译它:
g++ main.cpp
一切都成功了,我得到了一个a.out
文件。当我输入命令时ldd a.out
,我得到:
linux-vdso.so.1 => (0x00007ffdfdf38000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6183d77000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6183a74000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f618385e000)
libc.so.6 => /lib64/libc.so.6 (0x00007f618349d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f61840a7000)
我在这里有一个问题:
为什么编译时没有错误呢?我假设编译器/链接器会说:Hey, there is a function declared (in the boost hpp file), but not defined.
我假设 round 函数的定义是在 boost 库之一中定义的。我认为,我应该在编译/链接过程中添加类似-lboost_math_c99l
.
答案1
嗯,对我来说失败了(在 Mac OS X 上),所以让我们看看 CentOS 可能从哪里获取该文件......
# yum whatprovides '*/round.hpp'
...
在该输出中的某个地方应该引用boost-devel
一些建筑复古。因此,我假设您的系统已boost-devel
安装该软件包,其中包括所需的标头,编译器可以找到该标头(除非构建环境被破坏)。知道包名称后,您可以深入研究:
# rpm -ql boost-devel | grep ns/round.hpp
/usr/include/boost/math/special_functions/round.hpp