1. 系统必须安装visual studio 2010 win64编译器,编译器路径为
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cl.exe
2. 安装64位cmake
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat
原文地址http://www.cnblogs.com/JudeZHU/p/4801992.html
1 编译
1.1 准备
Win7 SP1 64位旗舰版。
Visual Studio 2013 SP3 win64,先安装。
SUNDIALS:http://computation.llnl.gov/casc/sundials/download/download.php。
建议下载2.5.0版本(不具有ARKODE求解器),笔者测试时(2015.9.9.),用Cmake编译2.6.0时似乎有一些问题。
Cmake:http://www.cmake.org/download/。
笔者测试时(2015.9.9.),用Cmake 3.3.1。
1.2 Cmake编译SUNDIALS-2.5.0
1.2.1 建立工作目录
笔者在C盘根目录建立如下路径:
即建立C:\sundials路径,并在其中分别建立三个文件夹:sundials-2.5.0-src、sundials-2.5.0-build、sundials-2.5.0-install。其中,sundials-2.5.0-src用于存放SUNDIALS解压缩文件:
sundials-2.5.0-build存放之后Cmake编译成功生成的VS工程项目文件;
sundials-2.5.0-install存放VS编译生成的函数库文件。
1.2.2 Cmake编译
打开sundials-2.5.0-src中CMakeLists.txt,找到"# Set some variables with info on the SUNDIALS project",将SUNDIALS版本号从2.4.0改为2.5.0,保存,关闭:
打开Cmake,如图
在"Where is the source code:"右边"Browse Source…"单击浏览到上面建立的sundials-2.5.0-src文件夹;在"Where to build the binaries:" 右边"Browse Build…"单击浏览到上面建立的sundials-2.5.0-build文件夹。如图:
单击"Configure",弹出编译器选择界面:
选择"Visual Studio 12 2013 Win64",选取"Use default native compilers",单击"Finish",返回Cmake主界面,等待配置完成:
应该看到通知框中出现"Configuring done"字样,过程中可能出现Warning。如果出现Error,需按提示查找原因。
其中,红色表示需要确认的选择,例如是不是配置BUILD_CVODE这一项,打钩表示有选择意向,要再次单击"Configure"才能配置。在后面所讲的配置完成后,多次单击"Configure",直到所有红色消除,表示配置完成。
找到"CMAKE_INSTALL_PREFIX"一项,将其路径改为上面建立的sundials-2.5.0-install文件夹路径,即
找到"BUILD_SHARED_LIBS",勾选上;找到"BUILD_STATIC_LIBS",取消勾选。这一操作,将输出动态链接库(SHARED_LIBS,.dll和其对应的.lib);而默认是只输出静态库(STATIC_LIBS,.lib)。笔者选择动态链接库,主要考虑以后可能需要和其他语言混合编程,如C#等,实现SUNDIALS库计算,其他语言做GUI和图形化。
找到"EXAMPLES_ENABLE"项,勾选上。这将在sundials-2.5.0-install文件夹中输出样例C文件,便于学习和复用。
其它各选项,笔者未做测试,可以看到其中还有诸如"MPI_ENABLE"项可以设置并行计算。
配置好选择项以后,点击"Configure",两次,直到所有红色消除,如下:
配置完成,单击"Generate",开始向sundials-2.5.0-build文件夹生成按照以上配置产生的VS 2013 Win64 C语言dll工程:
大约2s,看到上图所示"Generating done"字样,生成成功。
关闭CMake。
1.3 动态库生成
进到sundials-2.5.0-build文件夹,可看到生成了sundials.sln工程。
双击"sundials.sln",打开该工程,在对应的"解决方案资源管理器"中将出现相应的子工程:
其中,有三个子工程的字母全大写,分别是"ALL_BUILD"、"INSTALL"和"ZERO_CHECK"。
重要:请注意所使用的编译方案,在使用编译生成的库时,需要对应相应的配置,否则将出现不能识别dll的错误。
右键单击"ALL_BUILD"工程,出现:
单击"生成",将在sundials-2.5.0-build的各自工程目录文件夹中生成相应的动态链接库,例如cvode的库,找到"C:\sundials\sundials-2.5.0-build\src\cvode\Debug"路径,如下:
看到,已经生成了sundials_cvode.dll和sundials_cvode.lib。其它各库类似。
1.4 动态库安装
生成各库以后,为了便于统一调用方便,源代码提供者另外写了"INSTALL"工程,能将所有使用中需要的头文件(include)和库文件(dll和lib)和案例文件(Example)复制到前面定义的sundials-2.5.0-install文件夹中。
也就是说,当"ALL_BUILD"工程被编译后,sundials-2.5.0-install文件夹仍然是空的;只有将"INSTALL"工程编译后,sundials-2.5.0-install文件夹才被写入对应内容。
右键单击"INSTALL"工程,单击"生成"。成功后,sundials-2.5.0-install文件夹中出现相应文件夹:
关闭sundials.sln工程。
打开"include" →"cvode",其中头文件如下:
其他各库的头文件存放在各自文件夹中。
打开"lib"文件夹,其中库文件如下:
各库文件的dll和lib文件都存放在该路径下。
打开"examples"→" cvode"→" serial", cvode库的示例使用C文件存放在该路径,如下:
其它各库也类似。
重要:将路径"C:\sundials\sundials-2.5.0-install\include"和路径"C:\sundials\sundials-2.5.0-install\lib"添加到系统path环境变量中,完成最终安装。否则,使用过程中,将出现找不到dll的问题。
也可以通过工程的本地化配置,实现对系统对dll的寻址,参考http://blog.csdn.net/xiejiashu/article/details/43992747/。
2 试用
2.1 样例模型说明
样例模型采用SUNDIALS包提供的文件"cvRoberts_dns.c",其中描述了一个三物料化学反应问题,如下方程组所示:
其求解时域为 t∈[0,4×10 10 ] t∈[0,4×1010],其初始条件为:
在求解该动态问题的同时,还会利用求根技术,找到 y 1 =10 −4 y1=10−4和 y 3 =0.01 y3=0.01的时间。
2.2 Console工程
2.2.1 空白工程新建
在"C:\sundials"路径下,新建工程目录"SundialsWorks"。
打开VS 2013,新建一个VC++的Win32控制台应用程序"SundialsConsole01",位置选择路径"C:\sundials\SundialsWorks\",如下图:
单击"确定","下一步",选择"空项目","完成":
保存项目。
2.2.2 添加样例C文件
找到路径"C:\sundials\SundialsWorks\SundialsConsole01",新建"src"文件夹:
将目录"C:\sundials\sundials-2.5.0-install\examples\cvode\serial"中的文件"cvRoberts_dns.c"复制到新建的"C:\sundials\SundialsWorks\SundialsConsole01\src"路径下:
在SundialsConsole01.sln工程的解决方案资源管理器中,右键"源文件"→"添加"→"现有项",如图:
浏览到"C:\sundials\SundialsWorks\SundialsConsole01\src"路径,选取文件"cvRoberts_dns.c",成功后,单击该文件:
由于此时,并未给项目选择依赖的头文件和库文件,打开的"cvRoberts_dns.c"中头文件处有下划红线。
2.2.3 配置编译参数
修改运行平台为x64,以匹配库文件:
单击"项目"→"属性":
找到"配置属性"→"C/C++"→"常规",在"附加包含目录"中添加路径:C:\sundials\sundials-2.5.0-install\include
找到"配置属性"→"链接器"→"常规",在"附加库目录"中添加路径:C:\sundials\sundials-2.5.0-install\lib
找到"配置属性"→"链接器"→"输入",在"附加依赖项"中添加:sundials_cvode.lib;sundials_nvecserial.lib(用分号隔开)
找不到以上各项,可以先调试(F5)一次,出错后,将能看到以上完整项目录树。
2.2.4 编译生成结果
完成后,回到main文件,在main函数的"return(0);"(约197行)前添加"getchar();"函数,防止生成的Console窗口一闪而过。
执行调试(F5),将弹出执行结果:
如出错,最可能是找不到"sundials_cvode.dll"或"sundials_nvecserial.dll",可关闭SundialsConsole01.sln工程,再打开调试。
2.2.5 重要注意
如仍然出错,请按照上述诸过程进行检查。一般问题可能出在:
(1)没将"C:\sundials\sundials-2.5.0-install\include"和路径"C:\sundials\sundials-2.5.0-install\lib"添加到系统path环境变量中,或没将工程本地化配置,实现对系统对dll的寻址,参考http://blog.csdn.net/xiejiashu/article/details/43992747/;
(2)"项目"→"属性"的"C/C++"、"链接器"各项配置未完成;
(3)运行平台没有与库文件的生成平台匹配,如库文件选择了x64,而应用工程选用win32.