cmakelist的作用及使用
cmakelist的作用及使用
cpp平常的運(yùn)行方式
cpp為編譯型語(yǔ)言,需要把cpp文件編譯成可執(zhí)行文件
然后執(zhí)行可執(zhí)行文件
gcc main.cpp -o main執(zhí)行該可執(zhí)行文件 ./main
但由于一些依賴(lài)錯(cuò)綜復(fù)雜,且需要大量指令依次執(zhí)行
還有在服務(wù)器上尋找?guī)斓脑?#xff0c;產(chǎn)生了makefile
Makefile 即為一個(gè) 順序存了很多命令的文件。
我們執(zhí)行make的時(shí)候,即運(yùn)行makefile 按照順序執(zhí)行makefile里的指令
makefile的結(jié)構(gòu)是這樣的
目標(biāo):依賴(lài)目標(biāo)
命令
makefile里默認(rèn)一個(gè)目標(biāo)就是一個(gè)文件
我們假如想要不生成這個(gè)文件,就要加上
.PHONY: 目標(biāo)
使用make指令的時(shí)候,通常要加上各種參數(shù),表明你想要的是哪個(gè)目標(biāo),比如
install:…
…
uninstall: …
…
make install 就會(huì)執(zhí)行install
make uninstall 就會(huì)執(zhí)行uninstall
直接 make 會(huì)自動(dòng)執(zhí)行第一個(gè)目標(biāo)
但寫(xiě)makefile也是一個(gè)很繁雜的任務(wù),這時(shí)cmake出現(xiàn)了
它作為一個(gè)跨平臺(tái)的工具,可以幫助找資源,生成makefile
cmake一般的流程
首先 項(xiàng)目文件中一般會(huì)有一個(gè) cmakelist
我們創(chuàng)建一個(gè)文件夾叫build(什么名字都可以),代表在這里生成可執(zhí)行文件
在build路徑下,執(zhí)行cmake …
cmake會(huì)幫助鏈接好各個(gè)庫(kù),生成好makefile
再執(zhí)行 make 指令,生成可執(zhí)行文件
一個(gè)簡(jiǎn)單的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)???#指定項(xiàng)目名稱(chēng),生成的VC項(xiàng)目的名稱(chēng);
使用${HELLO_SOURCE_DIR}表示項(xiàng)目根目錄
file(GLOB SOURCES *.cpp)
將所有cpp文件 的絕對(duì)路徑 都加入到 SOURCES 變量中
find_package(PCL 1.9.1 REQUIRED …) 找?guī)?/p>
include_directories:指定頭文件的搜索路徑,相當(dāng)于指定gcc的-I參數(shù)
include_directories (${HELLO_SOURCE_DIR}/Hello)??#增加Hello為include目錄
link_directories:動(dòng)態(tài)鏈接庫(kù)或靜態(tài)鏈接庫(kù)的搜索路徑,相當(dāng)于gcc的-L參數(shù)
>> link_directories (${HELLO_BINARY_DIR}/Hello)?????#增加Hello為link目錄
add_subdirectory:包含子目錄
>> add_subdirectory (Hello)
add_executable:編譯可執(zhí)行程序,指定編譯,好像也可以添加.o文件
>> add_executable (helloDemo demo.cxx demo_b.cxx)???#將cxx編譯成可執(zhí)行文件——
add_definitions:添加編譯參數(shù)
add_definitions(-DDEBUG)將在gcc命令行添加DEBUG宏定義;
add_definitions( “-Wall -ansi –pedantic –g”)
target_link_libraries:添加鏈接庫(kù),相同于指定-l參數(shù)
target_link_libraries(demo Hello) #將可執(zhí)行文件與Hello連接成最終文件demo
add_library:
add_library(Hello hello.cxx)??#將hello.cxx編譯成靜態(tài)庫(kù)如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
總結(jié)
以上是生活随笔為你收集整理的cmakelist的作用及使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 百度地图API之行政区域边界
- 下一篇: 2022年广东省安全员A证第三批(主要负