cmakelist .so_使用CMakeList编译C++程序

写在前面

之前做工程模块跨平台移植(从Windows 到Linux),还有工程模块SDK的接口开发,都用到了CMakeList,所以今天整理一下基本的用法以及常见问题,感兴趣或者有需要的小伙伴可以继续往下看。


  1. CMakeList是什么?作用?
  2. 如何使用CMakeList
  3. 如何编写CMakeList
  4. 使用CMakeList进行C++程序编译时的常见问题

CMakeList是什么?作用?

讲CMakeList之前,就必须提到CMake。 在维基百科里面,CMake的定义如下:

CMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。 它用配置文件控制建构过程(build process)的方式和Unix的make相似,只是CMake的配置文件取名为CMakeLists.txt。CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。

划重点:

CMake 跨平台自动化构建系统(不管是Windows,Linux,还是Mac os,具有平台无关性),不依赖特定的编译器(不管是gcc,clang还是msvc),可支持多层目录、多应用程序与多个库(比较方便进行大型项目构建)。

CMakeList 是Cmake用于构建Makefile或者projects/workspace的配置文件。也就是说,我们不需要关注不同的Make工具需要的不同格式的MakeFile文件,而是直接使用Cmake 构建出适应当前平台的Makefile进而进行代码编译。

综上,CMakeList其实就是适配CMake语法的一个配置文件。 那么就进入下面的问题,这个配置文件要如何使用才能生成Makefile以及如何编写这个配置文件才能让Cmake识别并且达到我们最终想要的效果。

如何使用CMakeList

在Cmake进行建构时,其实提供了两种配置形式,第一种是CMake-GUI,还有一种就是普通的命令行配置(当然,命令行参数的配置项其实也是可以写在CmakeLists里面的)

CMakeGUI

因为在Linux上基本上不用GUI,都是直接写在配置文件里面,所以对于GUI的用法,简单给大家截个图。

ebd0a1178d9cac66f694498f5dcbc753.png
  1. source code,表示源码所在的目录,这个根目录下必须有一个CmakeLists
  2. binary,表示构建后的文件以及中间文件保存的目录
  3. add entry,表示增加的cmake构建条目,具体可以增加哪些条目,可以通过cmake arguments google一下
  4. configure,在已经配置好编译工具的情况下,点击configure就可以开始进行配置了
  5. generate,表示开始生成makefile或者vs project

CMake commands

cmake commands的参数还是很多的,而且并不是所有的参数都会在当前工程的相关配置中用到,所以只需要按需自取即可。同时,如果一个cmake 命令里面跟上那么多的参数,也是一件比较头疼的事情,所以更推荐大家把相关的配置参数都写在cmakelist里面,而使用cmake进行构建时,只需要对那些option进行配置就好了。

如何编写CMakeList

其实我们不管是在写程序代码,写dockerfile,写bash命令,都是会按照相应的语法进行编写。所以在写CMakeList的时候,也有对应的语法,只有按照语法规则编写的CMakeList 才能被Cmake识别,否则在cmake环节就会出现很多的warning甚至是error。那么,一个最基本的CMakeList.txt是什么样子的呢?下面的代码,就给大家展示了一个最基础的CMakeLists.txt。

#工程目录
----build
----include
----library
----util
----src
CMakeLists.txt

#cmakelist中,所有的相关语法命令是大小写不敏感的


#以下为一个完整的CMakeLists.txt目录
#cmake 编译相关
cmake_minimum_required(version 2.8) #cmake 最低版本要求,一般都是2.8往上,最好和目标平台的cmake版本一致
project(demo) #定义工程名称,这里用demo作为工程名称
message(status "Project Directory: ${PROJECT_SOURCE_DIR}") #打印相关消息消息,可以用来检查相关设置是否正确
set(cmake_build_type DEBUG)                      #指定编译类型 DEBUG/RELEASE
set(cmake_c_flags_debug "-g -Wall) # 指定编译器
add_compile_options(-std=gnu++11)  #添加编译选项,一些具体的编译选项大家可以自己查一下

option(_LINUX "build the project on linux " ON) #设置option,可以根据option从而选择代码中的宏定义部分
if(_LINUX)
    add_definitions("-D_LINUX") 
endif()

#工程配置相关,需要根据实际情况进行调整
include_directories(${CMAKE_SOURCE_DIR}/include) #添加引用的头文件目录,这里是相对目录的形式
link_directories(${CMAKE_SOURCE_DIR}/library) #添加引用的库文件目录,这里是相对目录的形式
add_subdirectory(${CMAKE_SOURCE_DIR}/util) #当需要构建大型工程,各个子目录都有对应的CMakeList时,使用该条语法
aux_source_directories(${CMAKE_SOURCE_DIR}/src DIR_SRC) #添加需要编译源文件到DIR_SRC变量

#生成可执行文件
add_executable(demo ${DIR_SRC})  #设置生成的可执行文件名字,并且把可执行文件和编译源文件关联
target_link_library(demo lib1,lib2,lib3) #上面只是link了库文件所在的目录,那么这里就是把具体的库和可执行文件相关联

#生成库文件
add_library(demo SHARED ${DIR_SRC}) #这里生成库文件有两种形式,一种是STATIC 静态库,一种是SHARED 共享库,如果需要跨硬件运行,一般是生成共享库
target_link_library(demo lib1,lib2,lib3)

使用CMakeList进行C++程序编译时的常见问题

1.find_package()

可以发现上面的示例中是没有find_package()这个语法的,如果通过这个命令,可以直接找到我们会用到的例如OpenCV或者Boost之类的常用库目录和头文件目录。但是一旦涉及到跨环境编译,如果依旧使用该命令,则需要重新编译相关的库,比较麻烦。 所以find_package()只建议在编译环境不会产生变化的情况下用,具体使用方法以及各个常用库的关键字,可以google一下

2.undefined reference to ...

一般出现这个问题,是可执行文件需要的library没有找到,在target_link_library 添加相应的lib名即可

3." .h " no such file

头文件引用的目录可能存在问题,需要确认相关头文件是否存在或者是否在当前include目录中

4.DSO missing

一般出现这个问题,是因为target_link_library中引用的lib,会直接根据lib+名字+.so这样的方式去查找。这种情况一般是,到真实库的软链接不存在,可以添加相关的软链接。

以上,如有错误,感谢指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值