本文主要介绍如何将一个依赖 Makefile 项目(MIDG)移植到 CMake 上。

首先介绍项目文件结构,文件主要由三个目录组成

  1. 3rdParty
  2. include
  3. src

其中,3rdParty 中包含两个外部函数库,即 MetisParMetis,生成两个静态链接库 libmetis.alibparmetis.asrc 包含项目所有源程序, include 则包含了全部头文件。

因此,我们在根目录下 cmake 配置文件内容如下

cmake_minimum_required(VERSION 3.1)
project(DGOM) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") set(CMAKE_C_COMPILER /usr/local/bin/mpicc)
set(CMAKE_CXX_COMPILER /usr/local/bin/mpicxx) # 3rdParty library
# Build with original makefile
set(METIS_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/lib/libmetis.a)
set(PARMETIS_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/lib/libparmetis.a) add_custom_target(build_metis ALL
COMMAND ${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/ParMetis-3.1/METISLib/
COMMENT "Original metis makefile target") add_custom_target(build_parmetis ALL
COMMAND ${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/ParMetis-3.1/ParMETISLib/
COMMENT "Original parmetis makefile target") add_library(metis STATIC IMPORTED)
add_library(parmetis STATIC IMPORTED) set_property(TARGET metis APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
set_target_properties(metis PROPERTIES IMPORTED_LOCATION_NOCONFIG "${METIS_LIBRARY}") set_property(TARGET parmetis APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
set_target_properties(parmetis PROPERTIES IMPORTED_LOCATION_NOCONFIG "${PARMETIS_LIBRARY}") add_dependencies(metis build_metis)
add_dependencies(parmetis build_parmetis) # source file
add_subdirectory(src)
  1. set(CMAKE_C_COMPILER mpicc)set(CMAKE_CXX_COMPILER mpicxx) 负责选择项目编译器,本项目中选择 mpich2
  2. Metis Parmetis 第三方库采用原始 makefile 编译,将编译好的静态库文件添加到项目中

1. 3rdParty

3rdParty 目录如下

./
└── ParMetis-3.1
├── METISLib
├── Manual
└── ParMETISLib

METISLibParMETISLib 分别为两个不同的网格划分库。原始make命令分别进入两个项目所在目录使用make命令即可。因此,在主目录 CMakeLists.txt 中调用 make 命令编译库函数,主要步骤如下:

1.1. 增加自定义编译方法

add_custom_target(build_metis ALL
COMMAND ${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/ParMetis-3.1/METISLib/
COMMENT "Original metis makefile target") add_custom_target(build_parmetis ALL
COMMAND ${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/ParMetis-3.1/ParMETISLib/
COMMENT "Original parmetis makefile target")

add_custom_target 通过用户给定的指令来增加一个新的编译目标。ALL 代表该目标添加到默认编译目标中,因此每次编译都会执行。

1.2. 增加两个编译目标

这两个目标为外部库 IMPORTED,而非项目自己编译的

add_library(metis STATIC IMPORTED)
add_library(parmetis STATIC IMPORTED) set_property(TARGET metis APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
set_target_properties(metis PROPERTIES IMPORTED_LOCATION_NOCONFIG "${METIS_LIBRARY}") set_property(TARGET parmetis APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
set_target_properties(parmetis PROPERTIES IMPORTED_LOCATION_NOCONFIG "${PARMETIS_LIBRARY}")

1.3. 将编译目标与编译方法联系

确保首先执行编译过程

add_dependencies(metis build_metis)
add_dependencies(parmetis build_parmetis)

2. 项目源文件

源文件编译时候需要头文件路径,并且与第三方库进行链接

set(SRC_LIST
Mesh2d.c Utils.c LoadBalance2d.c FacePair2d.c
ParallelPairs.c BuildMaps2d.c StartUp2d.c
MaxwellsRun2d.c MaxwellsMPI2d.c MaxwellsDriver2d.c
MaxwellsRHS2d.c InitCPU2d.c) add_executable(DGOM2 ${SRC_LIST}) include_directories("../include")
target_link_libraries(DGOM2 metis parmetis)

2.1. 增加可执行程序

add_executable(DGOM2 ${SRC_LIST})

2.2. 给出头文件路径

include_directories("../include")

2.3. 给定链接第三方函数库

target_link_libraries(DGOM2 metis parmetis)

CMake 工程调用 Makefile 编译项目的更多相关文章

  1. 通过脚本调用MSBuild编译项目时指定Configuration(解決方案配置)和Platform(解決方案平台),Rebuid(重新生成解决方案),Clean(清理解决方案)

    为了方便打包测试,自己PowerShell写了一个编译和发布的脚本,调用msbuild通过命令行来编译当前解决方案 后来发现一个问题,用VS编译解决方案,我通过 项目属性-Build设置 Releas ...

  2. Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库

    目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...

  3. C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)

    C++---初识<通过g++ / makefile  编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...

  4. 使用makefile编译多个文件(.c , .cpp , .h等)

    有时候我们要一次运行多个文件,这时候我们可以使用Makefile!!! ◊make是什么? make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执 ...

  5. Linux Makefile 编译速度的优化【转】

    转自:https://blog.csdn.net/QQ1452008/article/details/51851801 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  6. live555学习(一)通读Makefile编译live555

    live555学习(一)通读Makefile编译live555 live555 编译live555 学习开源 live555学习(一)通读Makefile编译live555 前言 live555简介 ...

  7. gcc与makefile编译 BY 四喜三顺

    gcc编译控制过程:(假设源代码为a.c)(1)源文件到预处理文件:    gcc -E -o a.cxx a.c    a.cxx显示调用哪些头文件(2)生成汇编代码:              g ...

  8. flex mxmlc 手动编译项目

    首先: 1.下载flex的sdk,如果你电脑有装flash builder,它自带了一份,位于安装目录的sdks目录下. 备注:(sdk依赖java的jre) 2.配置mxmlc的java运行环境jr ...

  9. 删除bin后,Eclipse重新编译项目

    今天做"用java.util.Properties类读写配置文件"Demo时,在编译项目时由于配置资源文件一起写入bin了.而Demo修改了配置文件,从新运行时配置文件不再更新,于 ...

随机推荐

  1. Java Filter型内存马的学习与实践

    完全参考:https://www.cnblogs.com/nice0e3/p/14622879.html 这篇笔记,来源逗神的指点,让我去了解了内存马,这篇笔记记录的是filter类型的内存马 内存马 ...

  2. 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字

    题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...

  3. 通过简单例子 | 快速理清 UML 中类与类的六大关系

    关于封面:我想我们都会离开 类与类之间的六大关系 泛化 ( Generalization ) ---> 表继承关系 实现 ( Realization ) 关联 ( Association ) 聚 ...

  4. UltraSoft - Alpha - Scrum Meeting 4

    Date: Apr 18th, 2020. 会议内容为 例行汇报. Scrum 情况汇报 进度情况 组员 负责 前两日进度 后两日任务 CookieLau PM 完成前后端交互规格的约定,了解前后端进 ...

  5. the Agiles Scrum Meeting 7

    会议时间:2020.4.15 21:00 1.每个人的工作 根据项目进度,我们将原先的完善组和debug组合并,成为团队项目增量开发组,原增量组成为个人结对项目增量开发组. 今天已完成的工作 个人结对 ...

  6. spring cloud config 结合 spring cloud bus实现配置自定的刷新

    在线上环境中,有时候我们希望系统中的某些配置参数在修改后,可以立即生效而不用重新启动服务.由上一节我们知道,我们可以把配置文件统一放到配置服务中进行管理,这一节我们在配置中心中整合spring clo ...

  7. USB OTG原理和 ID 检测原理

    OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了 电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机 ...

  8. TCP之拥塞窗口原理

    学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度. 拥塞 ...

  9. 【做题记录】CF1444A Division

    CF1444A Division 题意: 给定 \(t\) 组询问,每组给两个数 \(p_i\) 和 \(q_i\) ,找出最大的整数 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整 ...

  10. Java RMI学习与解读(二)

    Java RMI学习与解读(二) 写在前面 接上篇文章,这篇主要是跟着看下整个RMI过程中的源码并对其做简单的分析 RMI源码分析 还是先回顾下RMI流程: 创建远程对象接口(RemoteInterf ...