本文主要介绍如何将一个依赖 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. 看动画学算法之:队列queue

    目录 简介 队列的实现 队列的数组实现 队列的动态数组实现 队列的链表实现 队列的时间复杂度 简介 队列Queue是一个非常常见的数据结构,所谓队列就是先进先出的序列结构. 想象一下我们日常的排队买票 ...

  2. SpringBoot:Spring容器的启动过程

    一.简述 Spring的启动过程就是IoC容器的启动过程,本质上就是创建和初始化Bean的工厂(BeanFactory),BeanFactory是整个SpringIoC的核心,Spring使用Bean ...

  3. Gitee图床设置

    https://gitee.com/ 创建新仓库 点击右上角加号->新建仓库,填写基本信息后点击下面的创建即可 https://gitee.com/projects/new 创建新令牌 点击设置 ...

  4. SpringCloud微服务实战——搭建企业级开发框架(十三):OpenFeign+Ribbon实现高可用重试机制

      Spring Cloud OpenFeign 默认是使用Ribbon实现负载均衡和重试机制的,虽然Feign有自己的重试机制,但该功能在Spring Cloud OpenFeign基本用不上,除非 ...

  5. mongodb入门命令-创建表数据(二)

    1.mongodb入门命令 1.1 show databases; 或 show dbs; //查看当前的数据库 > show dbs; admin 0.000GB config 0.000GB ...

  6. 【java+selenium3】自动化截图 (十四)

    一.截图 1. Firefox浏览器截图 FirefoxDriver firefoxDriver = new FirefoxDriver(); firefoxDriver.getScreenshotA ...

  7. vue的逆向传值(子传父)

    逆向传值:子组件传值给父组件叫做逆向传值  (是不v欸允许的,必须经过事件触发才能传值) 逆向传值步骤: 1.要传值必须先抛出,在接收 语法: this.$emit("event" ...

  8. go输入Hello word

    package main import "fmt" func main() {     fmt.Println("hello word") } 输入hello ...

  9. mysql 免密码登录

    mysql 8免密码登录 UPDATE mysql.user SET authentication_string=null WHERE User='root'; FLUSH PRIVILEGES; e ...

  10. 详解calc()函数功能

    calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢?这一点也让我百思不得其解,今天有一同事告诉我,说CSS3中有一个属性 ...