首页/文章/ 详情

使用cmake构建C++和Fortran

6天前浏览54
cmake是一个先进的现代化构建工具,其可以通过编写CMakeLists.txt文件,产生不同平台,支持不同编译器的构建文件,简化了不同平台的项目的编译和构建过程。

实际上,不少开源软件均采用Cmake进行构建。本文首先介绍在用命令行的方式编译和运行C++和Fortran程序,然后用最基本的例子表明如何采用Cmake进行构建。

在Windows系统下,在安装编译器时,通常会把编译器的安装路径写到系统环境变量里,这样我们可以直接在命令行里用编译器的exe名称启动程序。

例如,在本机上安装了Vs和oneAPI2025,其中vs包含了对于C和C++的编译器cl.exe,打开oneApi安装目录下的命令提示符窗口,输入”cl”即可运行cl.exe,oneAPI包含了C++编译器icl.exe和Fortran编译器ifort.exe,因此输入相应的目录即可运行相应的编译器。

这样,只要我们有了源代码,就可以直接在命令行里运行,不需要打开vs创建项目:

编译器自带就把代码编译成了exe,接下来直接输入text1.exe即可运行。

上面这种命令行的方式很简单,对于单个程序时也很方便,如果有多个程序,将多个程序直接写在后面即可,如“cl test1.cpp a1.cpp a2.cpp”

当程序中调用了外部库时,我们当然依然可以采用命令行的方式来编译。但是,配置include路径,设置库文件的目录例如.lib等就很麻烦,而通过Cmake,编写一次CmakeLists文件,我们后续就可以不用重复设置,避免重复工作。

在Windows下,安装好cmake后,我们可以通过打开cmake-gui用界面来进行cmake构建操作,也可以用命令行的方式进行构建。

以下是一个例子:

编写好源程序文件和CMakeLists.txt:








// cmake-test1.cpp#include <iostream>int main(int argc, char const *argv[]){std::cout<<"this is cmake-test1\n";return 0;}


CMakeLists.txt中的内容:




cmake_minimum_required (VERSION 3.31.5)project (cpp1)add_executable(test1 cmake-test1.cpp)


在cmakeLists.txt共有3行内容,第一行是表明编译时cmake的最小版本,第二行创建了一个叫cpp1的项目,第3行是把cmake-test1.cpp文件加入到项目里,生成一个test1.exe的可执行文件。

运行cmake-gui.exe,设置下cpp文件所在路径和希望生成的文件的路径,在先后点击Configure和Generate,就会在build目录下生成相应的解决方案文件。

用vs打开cpp1.sln,把test1项目设为启动项目,即可运行。

以上,即是对于C++采用cmake进行构建的过程。看起来似乎流程并不简要,但是实际上对于大型工程,能够简化不少。

对于Fortran构建,一般还需要在CMakeLists中添加对Fortran的支持:





cmake_minimum_required (VERSION 3.31.5)project (fortran1)enable_language(Fortran)add_executable(cmake1 fortran-cmake1.f90)


上面是用Cmake构建C++和Fortran项目中的最基础例子,当然实际中CMAKE还有更多的知识需要学习,例如如何添加头文件路径,添加依赖库,指定各种编译选项,指定编译器等。在下一篇推文中,我们将介绍如何用Cmake工具完成大型稀疏矩阵特征值求解开源库Arpack的编译安装。

以上,即是本文的全部内容,感谢您的阅读


来源:大狗子说数值模拟
UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-04-12
最近编辑:6天前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 7粉丝 13文章 53课程 0
点赞
收藏
作者推荐

有限元基础知识:线搜索

上次说到了完全牛顿法与修正牛顿法,有限元基础知识:牛顿法与修正牛顿法修正牛顿法往往与线搜索(Linesearch)算法共同使用,线搜索这个算法,顾名思义,就是沿着当前这条线进行搜索,这条线在改进牛顿法中就是已经计算好的(回顾上文可知,这个可能是每隔好多个迭代步才会更新的),那是搜索什么呢?答案就是:沿着这个方向去搜索多大的步长才能达到势能最低。也就是说现在前进的方向由固定了,具体沿着这条路走多远则由线搜索确定。在没有引入线搜索的时候:那么在引入线搜索后,就变成了所以可以发现这里我们引入了一个额外的系数,去对位移增量进行一定的放缩,也就是沿着这条方向决定步长。由于我们希望在线搜索后系统达到势能最小,那么也就是即残余的载荷向量与增量位移向量相正交。由这些公式我们就可以计算得到,然而呢,准确的得到首先是会非常繁琐,其次在大多数情况下也没有必要,我们实际中往往是根据一些迭代算法取得一些相较当前步长更优的解也就足够了,所以我们一般情况下会定义而当在不断的线搜索迭代中,当我们得到了也就是说当有所减小的时候就认为可以了,其中是个系数一般取为.一般来说上述linesearch的内部迭代可以选用以下几种方法(后续可以详细介绍):二分法或Illinois步长Wolfe方法Goldstein方法在完全牛顿法中,我们其实无需要使用线搜索方法,因为每一步的切线刚度都是给予当前状态进行计算的,已经达到了步长最优,而在改进牛顿法、拟牛顿法法等牛顿法的改进型,由于方面的简化计算,我们往往都需要用线搜索方法来确定一个最合适的增量。在Abaqus等商软中,其实也是可以去修改线搜索的一些默认参数,如下图所示,可以从Others&gt;&gt;GerneralSolutionControls&gt;&gt;LineSearchControl这里修改线搜索的参数,其中:线搜索迭代的最大迭代数,对于完全牛顿,其为0,对于拟牛顿法(quasi),默认为5:最大与最小的参数限值:残余载荷向量的最小放缩系数,默认为0.25:最小的步长放缩系数,默认为0.1最后我们来看一下线搜索算法的效果,如下图的一个大变形壳的迭代过程,在使用线搜索后可以看到其相对不用线搜索的修正牛顿法迭代数少了很多,然而因为在线搜索中需要重复的计算内力向量,线搜索并不是没有代价的,效率最终很大程度上需要在线搜索和迭代数量之间找到一个平衡。下一次继续说说拟牛顿法。来源:大狗子说数值模拟

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈