本文主要介绍如何将一个依赖 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. 用例图示例:使用系统边界表示多个项目 / Using System Boundary to model Multiple Projects in Use Case Diagram

    什么是用例图? 用例是一种捕获系统功能需求的技术.用例描述了一个独立于实现细节的期望行为.用例的目标是捕获用户设想的所有系统级功能.从用户的角度来看,用例是关于系统应该做什么的.用例捕获系统利益相关者 ...

  2. 如何接入 K8s 持久化存储?K8s CSI 实现机制浅析

    作者 王成,腾讯云研发工程师,Kubernetes contributor,从事数据库产品容器化.资源管控等工作,关注 Kubernetes.Go.云原生领域. 概述 进入 K8s 的世界,会发现有很 ...

  3. 第七次Scrum Metting

    日期:2021年5月5日 会议主要内容概述:前后端对接,以及接下来的测试优化等工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 测试数据模块和 ...

  4. [Beta]the Agiles Scrum Meeting 8

    会议时间:2020.5.22 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助解决博客评分功能遇到的问题 tq 暂无 wjx 完成批量创建团队项目功能 班级 ...

  5. CentOS系统优化一键配置脚本

    #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export P ...

  6. springBoot服务整合线程池ThreadPoolTaskExecutor与@Async详解使用

    ThreadPoolExecutor:=======这个是java自己实现的线程池执行类,基本上创建线程池都是通过这个类进行的创建.ThreadPoolTaskExecutor:========这个是 ...

  7. spring cloud feign的各种配置的使用

    在上一节我们完成了feign的基本使用,学会了feign如何去调用其他微服务,这次我们来完成feign的一些自定义配置. 实现功能:     1.全局修改feign的配置和单独修改feign客户端的配 ...

  8. qwt使用细节

    在使用QWT进行二维曲线绘制,使用方法如下: class Plot: public QwtPlot { Q_OBJECT -- } 报错:error LNK2001: 无法解析的外部符号"p ...

  9. oracle物化视图创建及删除

    --删除物化表的日志表 DROP MATERIALIZED VIEW LOG ON 表名; --为将要创建物化视图的表添加带主键的日志表 CREATE MATERIALIZED VIEW LOG ON ...

  10. 让Visual Studio x64 支持 __asm内联汇编

    目录 让Visual Studio x64 支持 __asm内联汇编 Intel Parallel Studio XE 2016安装 设置Interl C++ Compiler 使VS x64支持内联 ...