cmake工具在linux平台下面的使用
程序员文章站
2022-06-05 21:02:28
...
在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