Cmake学习
CMake调用boost的编译脚本
cmake_minimum_required(VERSION 3.14)
project(boost_python)
#设置支持C++11特性
set(CMAKE_CXX_STANDARD 11)
#指定boost根目录
set(BOOST_ROOT E:/local/boost_1_61_0)
#设置不适用系统的的boost的库
set(BOOST_NO_SYSTEM_PATHS ON)
#设置使用静态的boost库
set(Boost_USE_STATIC_LIBS ON)
#查找boost库
find_package(Boost COMPONENTS thread system REQUIRED)
#如果已经找到
if(Boost_FOUND)
MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
MESSAGE( STATUS "Boost_LIBRARY_DIRS = ${Boost_LIBRARY_DIRS}.")
include_directories(${Boost_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/3Party/websocketpp-master)
link_directories(${Boost_LIBRARY_DIRS})
add_executable(boost_python src/main.cpp)
target_link_libraries (boost_python ${Boost_LIBRARIES})
endif()
常见命令学习
SET(SRC_LIST main.c) #将.c文件设置到变量SRC_LIST里面,可以设置多个函数链接变量,
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #将生成的可执行文件放到build目录下的bin文件下
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #将生成的lib库,放到build目录下的lib文件下。
set( CMAKE_BUILD_TYPE "Debug" ) # "REALEASE"
${PROJECT_BINARY_DIR} #一般就是build目录下
${PROJECT_SOURCE_DIR} #就是CmakeLists.txt的同级目录。
ADD_SUBDIRECTORY(src ) #有多个目录的时候,每个目录都要写一个CmakeLists.txt文件,将这个文件包含进来。
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"..)
SATUS ,输出前缀为 — 的信息, FATAL_ERROR,立即终止所有 cmake 过程, SEND_ERROR,
产生错误,生 成过程被跳过。
SHARED,动态库 STATIC,静态库 MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) #生成库文件
SET(LIBRARY_OUTPUT_PATH <路径>) #将生成的库放到指定路径下
#设置库文件的版本和多个同名字的库文件,还不是很懂!!
SET_TARGET_PROPERTIES,其基本语法是:
SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
#可执行文件链接库文件
TARGET_LINK_LIBRARIES(main libhello.a)
#查看可执行文件链接的库文件
ldd mian #main是可执行文件
#这条指令可以用来向工程添加多个特定的头文件搜索路径
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件
搜索路径放在已有路径的前面
2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
include_directories(/usr/include/hello) #这是绝对路径,可以配合CMAKE_INCLUDE_DIRECTORIES_BEFORE使用
#下面用来找特定路径的头文件和库文件,要在~/.bashrc里面设置路径
#如 export ASIO_ROOT="/home/jb/install/asio"
# 如 export CMAKE_INCLUDE_PATH=“/home/include”
特殊的环境变量 CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH
#当然也是可以直接include_directories()绝对路径来查找,但是设置环境变量的方法比较智能,看起来高大尚,我刚#开始也是被搞懵逼了。
这里简单说明一下,FIND_PATH 用来在指定路径中搜索文件名,比如:
FIND_PATH(myHeader NAMES hello.h PATHS /usr/include /usr/include/hello)
FIND_PATH(myHeader hello.h) #cmake会区会去~/.bashrc里面的路径查找哪个有hello.h的头文件,然后将该文件的路径给myHeader
IF(myHeader) #如果找到路径
INCLUDE_DIRECTORIES(${myHeader}) #那就包含进来。
ENDIF(myHeader)
CMAKE_INSTALL_PREFIX 变量类似于 configure 脚本的 – prefix,常见的使用方法看起来是这个样子:
cmake -DCMAKE_INSTALL_PREFIX=/usr . #/usr .代表要安装的目录,可以更改
#常见的命令例子
ARCHIVE 特指静态库, LIBRARY 特指动态库, RUNTIME特指可执行目标二进制
INSTALL(TARGETS ${PROJECT_NAME} #可执行文件
RUNTIME DESTINATION bin #可执行文件的目录bin
LIBRARY DESTINATION lib #lib的目录lib
ARCHIVE DESTINATION libstatic #动态库的目录libstatic
)
INSTALL(FILES COPYRIGHT README DESTINATION doc/cmake/t2) #将文件COPYRIGHT README放到doc/cmake/t2目录下
INSTALL(PROGRAMS run.sh DESTINATION bin) #将sh文件放到bin目录下
INSTALL(DIRECTORY doc/ DESTINATION doc/cmake/t2) #将doc目录下的内容安装到doc/cmake/t2目录下
#执行
cmake -DCMAKE_INSTALL_PREFIX=/home/jb/install/Test
make
make install
1.CMAKE_SOURCE_DIR == PROJECT_SOURCE_DIR
2.CMAKE_BINARY_DIR == PROJECT_BINARY_DIR
3.CMAKE_CURRENT_SOURCE_DIR #指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。
4.CMAKE_CURRRENT_BINARY_DIR #他指的是 target 编译目录。
5.CMAKE_CURRENT_LIST_FILE #输出调用这个变量的 CMakeLists.txt 的完整路径
6.CMAKE_CURRENT_LIST_LINE #输出这个变量所在的行
7,CMAKE_MODULE_PATH
#这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己
#编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理
#CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设
#置一下。比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
#这时候你就可以通过 INCLUDE 指令来调用自己的模块了。
8.使用$ENV{NAME}指令就可以调用系统的环境变量了。
#比如
MESSAGE(STATUS “HOME dir: $ENV{HOME}”)
#设置环境变量的方式是:
SET(ENV{变量名} 值)
1 ,BUILD_SHARED_LIBS
这个开关用来控制默认的库编译方式,如果不进行设置,使用 ADD_LIBRARY 并没有指定库
类型的情况下,默认编译生成的库都是静态库。
如果 SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。
3,CMAKE_C_FLAGS
设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
4,CMAKE_CXX_FLAGS
设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
在这里插入代码片
版权声明:本文为weixin_45810093原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。