文章目录

  • 1.add_library
  • 2.add_executable
  • 3.编译步骤
  • 4.作者答疑

  在Linux下,没有非常优秀的IDE工具,程序的编译也是需要命令行,一行一行的手写,比较麻烦,比较了许多的方式,作者认为采用CMake编写脚本来控制编译的方式,非常方便,下面是编译一个动态链接库和可执行程序的例子。代码如下所示:

cmake_minimum_required (VERSION 2.6)
project (DWFCall)#设置版本号
set(Tutorial_VERSION_MAJOR 1)
set(Tutorial_VERSION_MINOR 0)#调试信息
#SET(CMAKE_BUILD_TYPE Debug)
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
#SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")#配置编译参数文件
configure_file ("${PROJECT_SOURCE_DIR}/DWFCallConfig.h.in""${PROJECT_BINARY_DIR}/DWFCallConfig.h")#添加一个路径使得我们可以找到DWFCallConfig.h文件
include_directories("${PROJECT_SOURCE_DIR}")#包含文件路径
include_directories("${PROJECT_BINARY_DIR}")#包含文件路径
include_directories("/usr/local/include")#包含文件路径
include_directories("/usr/local/include/dwf")#包含文件路径MESSAGE(STATUS "source path = ${PROJECT_SOURCE_DIR}.")
MESSAGE(STATUS "project name = ${PROJECT_NAME}.")#设置链接路径
SET(LINK_PATH . "/usr/local/lib")#链接库命令
link_directories(${LINK_PATH})#链接库路径#编译选项
add_compile_options(-fexec-charset=utf-8 -finput-charset=utf-8)#链接库文件
SET(SRC_CODE DWFExport.cpp ACADPrintScript.cpp ADwfAlg.cpp)
SET(EXE_NAME "t")
MESSAGE(${SRC_CODE})SET(CMAKE_EXE_LINKER_FLAGS '-Wl,-rpath=/usr/local/lib')
add_library(${PROJECT_NAME} SHARED ${SRC_CODE})#编译库
target_link_libraries(${PROJECT_NAME} "libdwfcore-1.7.0.so" "libdwftk-7.7.0.so" "libiconv.so" dl)
#target_link_libraries(${PROJECT_NAME} "libdwfcore-1.7.0.so" "libdwftk-7.7.0.so" "libiconv.a")
add_executable(${EXE_NAME} DWFReadWriterProject.cpp)#编译可执行文件
target_link_libraries(${EXE_NAME} "libDWFCall.so" "libdwfcore-1.7.0.so" "libdwftk-7.7.0.so" "libiconv.so" dl)
#target_link_libraries(${EXE_NAME} "libDWFCall.so" "libdwfcore-1.7.0.so" "libdwftk-7.7.0.so" "libiconv.a")

  详细解释请查看注释,如果脚本命令的含义不清楚,可以网上搜索下。先阐述几个常用参数含义:

1.add_library

该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。该指令常用的语法如下:
  add_library( [STATIC | SHARED | MODULE]
   [EXCLUDE_FROM_ALL]
  [source1] [source2] […])
  其中表示库文件的名字,该库文件会根据命令里列出的源文件来创建。而STATIC、SHARED和MODULE的作用是指定生成的库文件的类型。STATIC库是目标文件的归档文件,在链接其它目标的时候使用。SHARED库会被动态链接(动态链接库),在运行时会被加载。MODULE库是一种不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数。默认状态下,库文件将会在于源文件目录树的构建目录树的位置被创建,该命令也会在这里被调用。而语法中的source1 source2分别表示各个源文件。

2.add_executable

使用给定的源文件,为工程引入一个可执行文件。
  add_executable(< name> [WIN32] [MACOSX_BUNDLE]
  [EXCLUDE_FROM_ALL]
  source1 source2 … sourceN)
  引入一个名为< name>的可执行目标,该目标会由调用该命令时在源文件列表中指定的源文件来构建。
  3.target_link_libraries:该指令的作用为将目标文件与库文件进行链接。该指令的语法如下:
  target_link_libraries( [item1] [item2] […] [[debug|optimized|general] ] …)
  上述指令中的是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。

3.编译步骤

  cd source (CMakeLists.txt 所在目录)
  cmake .
  make

4.作者答疑

  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

CMake编译C++项目-简单范例-编译脚本-Linux相关推荐

  1. protobuf java 编译_Maven项目中,编译proto文件成Java类

    新建Maven项目 新建一个 Maven 项目: pom定义了最小的maven2元素,即:groupId,artifactId,version. groupId:项目或者组织的唯一标志,并且配置时生成 ...

  2. Bazel入门教程:编译C++项目

    文章目录 Bazel入门教程:编译C++项目 安装bazel 编译C++项目 建立工作区(workspace) 理解BUILD文件 使用Bazel编译项目 1. 编译你的第一个Bazel项目 2. 查 ...

  3. 3. CMake 系列 - 分模块编译安装项目

    目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 测试模块 2.4 顶层 CMakeLists.txt 3. 编译 & 安装 4. 项目安装基本语法 ...

  4. 使用Cmake生成跨平台项目编译解决方案

    项目最近有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护 ...

  5. 乐鑫esp8266学习rtos3.0笔记:如何在 windows 用 CMake 编译 ESP8266 项目。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 基于C SDK的ESP8266开发技术全系列笔记 一.N ...

  6. 精读《如何编译前端项目与组件》

    1 引言 说到前端编译方案,也就是如何打包项目,如何编译组件,可选方案有很多,比如: 通过 webpack / parcel / gulp 构建项目. 通过 parcel / gulp / babel ...

  7. Vcam项目下载及编译

    Vcam项目下载及编译 编译准备: ndk:android-ndk-r8e,需要打google的patch,很简单,只需改一行即可 sdk:adt-bundle-linux-x86-20131030. ...

  8. 初识openCV VS编译C++项目

    0 OpenCV概览 OpenCV是一个开源的计算机视觉库,可以从 http://opencv.org 获取. 1999 年,Gary Bradski(加里·布拉德斯基)当时在英特尔任职,怀着通过为计 ...

  9. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

最新文章

  1. 从VirtualBox虚拟主机访问NAT客户机的方法
  2. android:AlertDialog控件
  3. 如何高效的利用博客园?
  4. Android使用Application总结
  5. 淮阳一高2021高考成绩查询,周口教育网2021年淮阳中招成绩查询系统
  6. SQL Server中的SQL语句优化与效率问题
  7. Ubuntu网络配置相关相关
  8. windows c++ 原子操作_高分辨质谱数据处理操作篇
  9. mysql undo log回收_MySQL5.7 可以回收(收缩)undo log回滚日志物理文件空间
  10. [WinForm]dataGridView导出到EXCEL
  11. 在IDEA中实战Git-branch入门
  12. LibreOJ #109. 并查集
  13. 微信小程序 this.data与this.setData
  14. 用android编写使用按钮ImageButton和切换器ImageSwitcher
  15. 调出cmd输入时的光标
  16. 记一次JAVA ssm+mysql 开发
  17. 没做好这些准备,千万不要婚前同居!!
  18. 电缆故障测试仪的基本原理与组成——TFN DG15M电缆故障测试仪
  19. Baumer profinet 接口编码器的简单调试
  20. SQL Server数据库入门学习

热门文章

  1. Java实现宿舍管理系统、基于java、JDBC、GUI(含源文件/综合项目)
  2. [算法]n阶台阶,一次走一步或两步,有多少种走法?
  3. sequelize 向数据库插入数据,自增id该如何添加
  4. 2.13学习生活总结
  5. 免费发匿名信匿名短信的教程
  6. IEEE Access 上岸指南
  7. linux驱动设备开发1——字符设备驱动
  8. 机器学习-随机森林算法梳理
  9. 关于父子节点、父子元素、祖辈元素的获取
  10. C语言课后习题(计算增长率比值