NumCpp即numpy对应的c++库。配置NumCpp首先需要配置好Boost库。Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。本文参照相关资料,详细介绍在windows10+vs2017环境下Boost与NumCpp的配置方法。
1.准备条件
(1)克隆numcpp项目:https://github.com/dpilger26/NumCpp
(2)下载boost安装包:https://www.boost.org/users/history/version_1_67_0.html
2.安装Boost
安装Boost有两种安装方法。一种是源码编译,另一种是直接下载安装好的二进制文件进行安装。本文以下详细介绍这两种方法。
(1)源码编译
如上图所示,下载相应的源码压缩包,并解压。解压时间比较长,需要耐心等待。
解压之后的文件如下:
双击批处理文件:bootstrap.bat
接下来需要会得到一个b2.exe文件,我们需要使用这个文件去编译源码并得到lib库文件。此出建议以管理有身份进入Windows PowerShell(有些用windows的小伙伴不太适应用shell,没有关系,照着做就行),进入的方式如下
在开始图标
上右击,可得:
单机Windows PowerShell(管理员),即以管理员身份进入。
输入命令
cd D:\boost_1_76_0
其中D:\boost_1_76_0是你解压boost_1_76_0.zip的文件夹路径。
接下来输入以下命令:
.\b2.exe --link=shared --toolset=msvc-14.1 --stagedir="D:\Boost64" --address-model=64 --architecture=x64
此处解释命令的含义:
–link=shared :生成动态链接库
–toolset=msvc-14.1:编译的库在vs2017环境下运行
–stagedir=“D:\Boost64”:编译库所在的目录,此处可以新建一个文件夹。
–address-model=64:生成64位平台库
–architecture=x64:可在vs x64平台下调试。(实际会生成32位的库和64位库)
在PowerShell中如下图所示输入命令:
回车即开始编译,等待一两分钟后编译结束,在D:\Boost64(我之前是编译在D:\Boost文件夹下)得到编译好的lib文件。
接下来测试Boost是否配置成功。
打开vs,新建一个控制台程序。右击项目名称–属性,并添加库目录:
首先将解压得到的安装目录D:\boost_1_76_0加入:
之后加入编译得到的库目录D:\Boost64\lib(我这儿加入的是D:\Boost\lib):
然后在主程序中输入以下代码:
#include<iostream>
#include<stdio.h>
#include<boost/version.hpp> //包含boost头文件
#include<boost/config.hpp>
int main() {
using namespace std;
cout << BOOST_VERSION << endl;
cout << BOOST_LIB_VERSION << endl;
cout << BOOST_PLATFORM << endl;
cout << BOOST_COMPILER << endl;
cout << BOOST_STDLIB << endl;
system("pause");
return 0;
}
调试运行,可以得到如图结果,表面boost库配置成功:
注意:如果是在x64平台下调试,则配置的时候也要选择x64平台,否则会出错。
(2)直接下载二进制文件
如果不想搞这么麻烦,直接下载二进制文件安装。如之前的图所示,点击Windows Binaries后,下载如图所示exe文件(boost_1_67_0-msvc-14.1-64.exe):
双击安装包选择相应的安装目录:
安装好后,得到库文件。接下来的步骤与使用源码编译的步骤类似,在链接器——常规中加入:D:\boost_1_76_0_1\lib64-msvc-14.1,在c/c++中加入:D:\boost_1_76_0_1。
3.编译NumCpp
在PowerShell中进入NumCpp的文件目录,输入以下命令:
cd D:\NumCpp-master
之后可以在NumCpp工程目录下手动建立一个build文件夹:
然后输入下面两条命令:
cd build#进入build文件夹
>> cmake ..#编译build上一层目录中的CMakeLists
关于cmake的内容有些小伙伴不理解,这儿没关系。推荐一个讲cmake的教程,虽然是在ubuntu下,但是cmake的代码都是想通的,有兴趣小伙伴可以学习一下:
https://www.bilibili.com/video/BV1fy4y1b7TC
这一步编译完成后,输入下一条cmake命令:
cmake --build . --target install
到此为止NumCpp都编译完成。Numpy编译得到的文件默认在C:\Program Files (x86)\NumCpp下,可以去看一看这个目录有没有相应的文件:
接下来进入vs,类似加入Boost的库文件,加入Numpy的include文件夹目录:
注意此时是进入VC++目录——包含目录。
接下来运行如下代码:
#include "NumCpp.hpp"
#include <cstdlib>
#include <iostream>
int main()
{
auto a = nc::eye<double>(4);
std::cout << a;
return EXIT_SUCCESS;
}
运行得到如下结果:
参考资料:
https://dpilger26.github.io/NumCpp/doxygen/html/md__c_1__github__num_cpp_docs_markdown__installation.html
——————————分界线———————————————
集成完Numcpp用了一段时间后,发现自己的三维显示模块出现了一些很奇怪的问题。我的三维显示是用PCL库带的VTK+Qt做的,集成完Numcpp后发现设置点云的尺寸以及清除视图中的点云等功能都使用不了了,百思不得其解。后来发现原来PCL在安装时自带了一个boost库,以我的为例,boost库在D:\pcl2017\PCL 1.8.1\3rdParty\Boost\文件夹下。且PCL 1.8.1自带的boost库是1.64版本,上述介绍配置的boost库是1.76版本。一个项目中引入了两个不同版本的同一个库,自然会造成一些奇怪的问题。方法就是只保留一个boost库。由于需要与PCL配置相兼容,因此保留boost 1.64。即将上文所述的添加头文件与lib文件的文件夹替换,此处例子为:
D:\boost_1_76_0--->D:\pcl2017\PCL 1.8.1\3rdParty\Boost\include\boost-1_64
D:\Boost64\lib--->D:\pcl2017\PCL 1.8.1\3rdParty\Boost\lib
实际使用中发现,替换成boost 1.64在boost\math\special_functions文件夹下会少一个chebyshev.hpp文件,解决方法就是从boost 1.76的文件夹下将该文件复制过来即可。
心得:推荐使用高版本的PCL,此处由于不想大动环境,算是投机取巧。此外当工程中链入较多第三方库时,注意观察第三方库是否携带一些子库,会与其他第三方库的子库发生冲突。