cmakelist的作用及使用

cmakelist的作用及使用

cpp平常的运行方式

cpp为编译型语言,需要把cpp文件编译成可执行文件

然后执行可执行文件

gcc main.cpp -o main

执行该可执行文件 ./main

但由于一些依赖错综复杂,且需要大量指令依次执行

还有在服务器上寻找库的原因,产生了makefile

Makefile 即为一个 顺序存了很多命令的文件。

我们执行make的时候,即运行makefile 按照顺序执行makefile里的指令

makefile的结构是这样的

目标:依赖目标

命令

makefile里默认一个目标就是一个文件

我们假如想要不生成这个文件,就要加上

.PHONY: 目标

使用make指令的时候,通常要加上各种参数,表明你想要的是哪个目标,比如

install:…

uninstall: …

make install 就会执行install

make uninstall 就会执行uninstall

直接 make 会自动执行第一个目标

但写makefile也是一个很繁杂的任务,这时cmake出现了

它作为一个跨平台的工具,可以帮助找资源,生成makefile

cmake一般的流程

首先 项目文件中一般会有一个 cmakelist

我们创建一个文件夹叫build(什么名字都可以),代表在这里生成可执行文件

在build路径下,执行cmake …

cmake会帮助链接好各个库,生成好makefile

再执行 make 指令,生成可执行文件

一个简单的cmakelist的样式

cmake_minimum_required(VERSION 2.6)
project(MY_PROJECT)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(PCL 1.9.1 REQUIRED COMPONENTS common io geometry kdtree search features surface visualization filters)

file(GLOB SOURCES main.cpp)

add_executable(server ${SOURCES})
#include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

#include_directories("/opt/libjpeg-turbo/include")
#link_directories("/opt/libjpeg-turbo/lib")


include_directories(server ${PCL_INCLUDE_DIRS} )
target_link_libraries(server ${PCL_LIBRARIES} turbojpeg zstd)

SOURCES /home/eminem/pcl_test/main.cpp
PCL_LIBRARY_DIRS /usr/lib/x86_64-linux-gnu
PCL_DEFINITIONS -DDISABLE_PCAP;-DDISABLE_PNG;-DDISABLE_LIBUSB_1_0
PCL_INCLUDE_DIRS /usr/include/pcl-1.10;/usr/include/eigen3;/usr/include;/usr/include/ni;/usr/include/openni2;/usr/include/vtk-7.1;/usr/include/freetype2;/usr/include/x86_64-linux-gnu
PCL_LIBRARIES pcl_common;pcl_octree;pcl_io;pcl_kdtree;pcl_search;pcl_features;pcl_surface;pcl_visualization;pcl_sample_consensus;pcl_filters;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_iostreams.so;/usr/lib/x86_64-linux-gnu/libboost_regex.so;optimized;/home/eminem/.conda/envs/myTorch/lib/libqhull_p.so;debug;/home/eminem/.conda/envs/myTorch/lib/libqhull_p.so;/usr/lib/libOpenNI.so;/usr/lib/libOpenNI2.so;vtkChartsCore;vtkCommonColor;vtkCommonCore;vtksys;vtkCommonDataModel;vtkCommonMath;vtkCommonMisc;vtkCommonSystem;vtkCommonTransforms;vtkCommonExecutionModel;vtkFiltersGeneral;vtkCommonComputationalGeometry;vtkFiltersCore;vtkInfovisCore;vtkFiltersExtraction;vtkFiltersStatistics;vtkImagingFourier;vtkImagingCore;vtkalglib;vtkRenderingContext2D;vtkRenderingCore;vtkFiltersGeometry;vtkFiltersSources;vtkRenderingFreeType;/usr/lib/x86_64-linux-gnu/libfreetype.so;/usr/lib/x86_64-linux-gnu/libz.so;vtkFiltersModeling;vtkImagingSources;vtkInteractionStyle;vtkInteractionWidgets;vtkFiltersHybrid;vtkImagingColor;vtkImagingGeneral;vtkImagingHybrid;vtkIOImage;vtkDICOMParser;vtkmetaio;/usr/lib/x86_64-linux-gnu/libjpeg.so;/usr/lib/x86_64-linux-gnu/libpng.so;/usr/lib/x86_64-linux-gnu/libtiff.so;vtkRenderingAnnotation;vtkRenderingVolume;vtkIOXML;vtkIOCore;vtkIOXMLParser;/usr/lib/x86_64-linux-gnu/libexpat.so;vtkIOGeometry;vtkIOLegacy;vtkIOPLY;vtkRenderingLOD;vtkViewsContext2D;vtkViewsCore;vtkRenderingContextOpenGL2;vtkRenderingOpenGL2;FLANN::FLANN

六 命令

project (HELLO)   #指定项目名称,生成的VC项目的名称;

使用${HELLO_SOURCE_DIR}表示项目根目录

file(GLOB SOURCES *.cpp)

将所有cpp文件 的绝对路径 都加入到 SOURCES 变量中

find_package(PCL 1.9.1 REQUIRED …) 找库

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

include_directories (${HELLO_SOURCE_DIR}/Hello)  #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

>> link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello为link目录

add_subdirectory:包含子目录

>> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

>> add_executable (helloDemo demo.cxx demo_b.cxx)   #将cxx编译成可执行文件——

add_definitions:添加编译参数

add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library:

add_library(Hello hello.cxx)  #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( … ): lots of properties… OUTPUT_NAME, VERSION, …

link_libraries( lib1 lib2 …): All targets link with the same set of libs

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMakeLists.txt是一个用于管理和构建CMake项目的文件。它包含了一系列指令和配置选项,用于指定项目的编译参数、依赖关系以及构建规则等。CMakeLists.txt文件可以通过引用其他文件和宏来组织项目的结构,并且可以定义多个目标,如可执行文件、静态库和动态库等。 在引用中的CMakeLists.txt文件中,首先使用cmake_minimum_required指令来指定CMake的最低版本要求。接下来使用project指令来定义项目的名称和版本号。然后使用configure_file指令来根据指定的配置文件生成config.h文件,并将生成后的文件添加到工程的包含目录中。 在引用中的CMakeLists.txt文件中,使用aux_source_directory指令将当前目录下的所有源文件添加到变量DIR_HELLO_SRCS中。然后使用add_library指令创建一个名为hello的库,并将DIR_HELLO_SRCS中的源文件添加到该库中。 在引用中的main.cpp文件中,首先包含了iostream和config.h头文件。然后在main函数中输出了项目的名称和版本号。 因此,cmakelist工程的主要作用是管理和构建CMake项目,通过配置CMakeLists.txt文件和引用其他文件来定义项目的结构和构建规则。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CMakeLists设置工程版本号(一):与C++集成](https://blog.csdn.net/lianshaohua/article/details/107977629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [多目录工程的CmakeLists.txt编写(自动添加多目录下的文件)](https://blog.csdn.net/this_is_me_anyway/article/details/80176349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值