cmake工具在linux平台下面的用法和示例

在windows下用vs管理项目,在linux下用cmake

通过情况下用cmake维护makefile文件用得比较多,也可以用别的

使用cmake的好处:

在不同平台下生成对应的makefile文件
每次写一遍就行

cmake使用方法:

linux下通过 sudo apt-get install cmake安装

cmakelists会把一个目录作为一个整体使用,使用cmake最主要的工作就是维护和编写cmakelists

一般mkdir build cd build先生成一个build目录
在build目录处理
在build里cmake …生成makefile文件
最后输入make即可

使用cmake的具体示例:

src放主逻辑,utility放辅助功能
未解决的问题:
在本示例中有使用的第三方库未做处理(一般事先安装好,如果报错还是要自己安装索性自己安装好在cmake中不体现)

根目录下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)  // 至少需要cmake版本
PROJECT(Socket)						//工程名称起名,没有太多意义
SET(CMAKE_C_COMPILER gcc)			//设置C编辑器
SET(CMAKE_CXX_COMPILER g++)			//设置C++编辑器
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fdiagnostics-color=auto -pthread -fexceptions -Wno-unused-local-typedefs -Wreorder -Wall -Wextra -Wpointer-arith -Wcast-qual -Wunreachable-code -Wno-deprecated -Wundef -Wdouble-promotion -Woverloaded-virtual -Wunused-parameter -Wno-deprecated -g -fpic -fPIC")	 // 设置C++编辑选项
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -D_DEBUG -00 --ggdb"}  //设置C++debug版本编辑选项 --D_DEBUG宏 --ggdb生成debug信息
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -D_DEBUG -02"}	//设置C++release编辑选项 -02表示优化级别
ADD_DEFINITIONS(-DPROTOBUF_INLINE_NOT_IN_HEADERS=0)  //需要预定义的宏
SET(PROJECT_ROOT_PATH "${CMAKE_SOURCE_DIR}/../")		//工程选项根目录,CMAKE_SOURCE_DIR为当前目录
SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin/")  //可执行文件生成位置
SET(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib/")		//库文件生成位置

INCLUDE_DIRECTORIES($ENV{GSL_ROOT}/include /usr/include/lua5.3 /usr/include/lua5.2)  //将不同位置第三方库文件包含进来,默认会去 /usr/include /usr/local/include 位置进行搜索
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib/)	//编译链接时能搜索到自己的库,上面生成的lib库在这里链接
INCLUDE_DIRECTORIES(${PROJECT_ROOT_PATH}/)	//包含特殊头文件
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/utility)
INCLUDE_DIRECTORIES(.)

ADD_SUBDIRECTORY(utility)	//增加子文件夹,有顺序关系,在这里先编译utility辅助对应库再编译src可执行文件
ADD_SUBDIRECTORY(src)

子目录下:

FILE(GLOB SOURCE_UTILITY "./*.cpp")	//GLOB表示查找所有.cpp结尾的文件,放到SOURCE_UTILITY里
ADD_LIBRARY(utility STATIC ${SOURCE_UTILITY}) //生成一个叫utility的静态库
ADD_EXECUTABLE(main main.cpp)	//生成一个可执行文件,需要main.cpp也可以往后加
TARGET_LINK_LIBRARIES(main utility)		//生成main需要对应的库,utility为之前生成的所以需要先生成utility
发布了154 篇原创文章 · 获赞 35 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/qq_39885372/article/details/104105987