文章目录

  • 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. iOS使用多线程提高数据并发访问 之七
  2. iOS UICollectionView 使用
  3. Attribute class invalid for tag present according to TLD
  4. 燃!阿里AI技术取得重大突破:连破中、英语言处理两项世界纪录
  5. iconpath 微信小程序_【报Bug】微信小程序 map 标记点iconPath图标 苹果手机 不能单个设置了。以前没有问题。现在不知道为啥不行了...
  6. php性能需求,PHP语言性能考察
  7. VMware (威睿) 虚拟化产品简介
  8. 程序猿:我的未来,在哪里?
  9. 【Paper-Attack】Poisoning Attacks to Graph-Based Recommender Systems
  10. 图解java多线程设计模式 pdf_图解Java设计模式之状态模式
  11. Vmware怎样使用nat和桥接方式解决虚拟机联网问题
  12. PHP --字符串编码转换(自动识别原编码)
  13. git reset简介
  14. 天 月_财务结算专业术语快来学习!月结和月结30天的区别
  15. 使用原生js发送请求
  16. Word弹窗提示“拼写或语法错误太多,无法继续显示”的处理办法
  17. 远景html制造机模板,台式机ALC892制作仿冒appleHDA的教程,前置MIC自动检测。
  18. C语言入门-绝对值(abs)
  19. 盘点世界十大软件外包公司排名是哪些公司
  20. php捉迷藏,查看“蘑菇捉迷藏!”的源代码

热门文章

  1. Optional是个好东西,你会用么?(全面深度解析)
  2. LaTeX命令速查手册 - 方法总比问题多
  3. Cesium ClippingPlane剖切 改造 限高分析
  4. 关于级联选择器Cascader数据太多会改变列表大小的问题
  5. Java汉字转汉语拼音工具类
  6. Revit调用winform
  7. 让孩子轻松掌握计算机技巧,大思英语教你如何让孩子轻松掌握学习英语的技巧...
  8. uniapp打包微信小程序详细步骤【前端开发】
  9. WordPress获取文章缩略图函数:get_the_post_thumbnail
  10. 数据共享-spark中共享变量深度解析