CMake 工程调用 Makefile 编译项目
2016-03-26 21:39
459 查看
本文主要介绍如何将一个依赖 Makefile 项目(MIDG)移植到 CMake 上。
首先介绍项目文件结构,文件主要由三个目录组成
3rdParty
include
src
其中,
因此,我们在根目录下 cmake 配置文件内容如下
首先介绍项目文件结构,文件主要由三个目录组成
3rdParty
include
src
其中,
3rdParty中包含两个外部函数库,即
Metis与
ParMetis,生成两个静态链接库
libmetis.a与
libparmetis.a。
src包含项目所有源程序,
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)
set(CMAKE_C_COMPILER mpicc),
set(CMAKE_CXX_COMPILER mpicxx)负责选择项目编译器,本项目中选择
mpich2
Metis
Parmetis第三方库采用原始 makefile 编译,将编译好的静态库文件添加到项目中
1. 3rdParty
3rdParty目录如下
./ └── ParMetis-3.1 ├── METISLib ├── Manual └── ParMETISLib
METISLib与
ParMETISLib分别为两个不同的网格划分库。原始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)
相关文章推荐
- 中小型web架构
- 分治法-最近对问题
- BestCoder Round #77
- Android资源
- 分享在winform下实现模块化插件编程
- Django升级1.8的一些问题
- DB2报错:在对连接的底层socket执行操作期间发生通信错误
- 解决Hibernate删除异常:deleted object would be re-saved by cascade
- 数据库触发器
- Android 开源框架Universal-Image-Loader---源代码解读
- BestCoder Round #77 1002.xiaoxin juju needs help(HDU5651)
- URAL 2070. Interesting Numbers(素数打表 数学题)
- cocos studio 执行命令出错,返回值:2。
- DL:Convolutional Deep Belief Networks(CDBN) 代码(matlab)理解
- C# partial部分类的使用
- 自定义下拉刷新的listview
- jar学习3
- 版本管理-gitlab
- Android项目通过NDK整合libjpg与libpng
- MySQL存储引擎--存储引擎的选择