Eigen是一个高性能的C++线性代数库,广泛用于科学计算、机器学习、计算机视觉等领域。不过,Eigen有点特别,它是一个纯头文件实现的库;也就是说,任何一个程序要引入它,只要include它的头文件就可以了。这天然就规避了差异操作系统差异编译器造成的二进制兼容的问题,所有的实现都include源代码了,那还不是轻松跨平台?
像Eigen这种风格的库就被称为Header Only库。这种库使用起来确实太方便了,所以现在许多库都接纳了这种设计。我们知道C/C++的声明和实现是分开的,所以使用起来相当的麻烦,类似的函数签名总是要写两次,然后把实现隐藏起来编译成静态库或者动态库。这种风格的库就完全不会有这个问题,include头文件就行。不过这种风格也不是没有缺点,好比增加了调用方的构建时间、构建成果体积增加、符号冲突、不能隐藏实现等,所以接纳这种风格的库一般都是模板库。
Header Only库也并不意味着不需要构建,因为构建还是包罗许多步骤的,使用CMake进行构建的关键指令如下:- # 配置CMake
- cmake .. -G "$Generator" -A x64 `
- -DCMAKE_BUILD_TYPE=RelWithDebInfo `
- -DCMAKE_PREFIX_PATH="$InstallDir" `
- -DCMAKE_INSTALL_PREFIX="$InstallDir" `
- -DBUILD_TESTING=OFF
- # 构建阶段,指定构建类型
- cmake --build . --config RelWithDebInfo
- # 安装阶段,指定构建类型和安装目标
- cmake --build . --config RelWithDebInfo --target install
复制代码 如果设置不构建测试程序,这个构建过程着实就是复制必须的头文件到安装目次。另外,还会生成一些.cmake格式的包配置文件到安装目次,这些文件是便于其他项目找到和使用这些Eigen的。不止Eigen,大多数CMake构建的库都会生成类似的包配置文件,这一点我们放在后续的文章中进行一步论述。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |