qmake和cmake的区别?
qmake
是为Qt
量身打造的,使用起来非常方便cmake
不如qmake
简单易用,但功能更强大out-of source
构建方式,Qt Creator
为qmake
也默认启用了该功能,称:shadow build
一般简单的项目使用qmake进行构建, 复杂的项目使用qmake编译。
/usr/local/bin和/usr/bin的区别?
/usr/bin
系统预装的一些可执行程序,随系统升级会改变
/usr/local/bin
用户安装的可执行程序,不受系统升级影响,用户编译安装软件时,一般放到/usr/local目录下
CMake
简介
比make更高级的编译配置工具,可以根据不同平台、编译器,生成相应的Makefile或者vcproj项目。
通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。
CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能。
网址
CMake下载网址:点我跳转CMake
使用步骤
- CMake主要编写CMakeLists.txt文件;
- 用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件;
- 最后用make命令编译源码生成可执行程序或共享库【so(shared object)】。
因此CMake的编译基本就两个步骤:cmake
和make
编写CMakeLists.txt
#1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.2)
#2.project name,指定项目的名称test,一般和项目的文件夹名称对应
PROJECT(test)
#3.head file path,头文件目录
INCLUDE_DIRECTORIES(include)
#4.source directory,把源文件目录src下的源代码文件加入变量DIR_SRCS
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#5.set environment variable,设置变量
SET(LIB_SRC ${DIR_SRCS})
#6.add executable file,添加要编译的可执行文件,为项目名test
#生成应用程序 test(在windows下会自动生成test.exe)
ADD_EXECUTABLE(${PROJECT_NAME} ${LIB_SRC})
#7.add link library,添加可执行文件所需要的库,比如我们用到了librealsense.so(命名规则:lib+name+.so),
#就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} realsense)
执行大概步骤:
cd test
mkdir build
cd build
cmake ..
make
./test
为了使用外部编译方式编译项目,需要先在和CMakeLists.txt
同目录下新建一个目录build。
在linux命令行下,首先进入目录build,然后运行命令cmake ..
(注:后面的..
不可缺少)
该命令使cmake检测编译环境,并生成相应的makefile。
接着,运行命令make进行编译。编译后,生成的所有中间文件和可执行文件会在build目录下。
其实,cmake
还可以直接在当前目录进行编译,无须建立build
目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且cmake
生成的makefile
无法跟踪所有的中间文件,即无法使用make distclean
命令将所有的中间文件删除。
因此,我们推荐建立build
目录进行编译,所有的中间文件都会生成在build
目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。
拓展
project(TestFaceDetect)#工程名字
cmake_minimum_required(VERSION 2.8)#CMAKE版本
#源码路径
#aux_source_directory(. SRC_LIST)
#源码文件(手工指定)
set(LIB_SRC person.cpp)
set(APP_SRC main.cpp)
#将person.cpp编译成静态库
add_library(libperson ${LIB_SRC})
#将person.cpp编译成动态库
#宏定义方法,任选一种
add_definitions("-DLIBPERSON_BUILD")
#set(CMAKE_C_FLAGS "") #c程序的
#set(CMAKE_CXX_FLAGS "-DLIBPERSON_BUILD") #c++程序的
add_library(libperson SHARED ${LIB_SRC})
#将main.cpp编译成exe
add_executable(${PROJECT_NAME} ${APP_SRC})
#exe链接时的依赖库
target_link_libraries(${PROJECT_NAME} libperson)
引入第三方库:
#引入第三方库
include_directories(${PROJECT_SOURCE_DIR}/fcsdk)
#首先要添加库,重要
add_library(libface SHARED IMPORTED)
#再设置库的位置
#引入dll库,特有的
set_target_properties(libface
PROPERTIES
IMPORTED_IMPLIB
${PROJECT_SOURCE_DIR}/fcsdk/FaceCapture.lib)
#set_property(TARGET
# libface
# PROPERTY
# IMPORTED_IMPLIB
# ${PROJECT_SOURCE_DIR}/fcsdk/FaceCapture.lib)
#引入第三方so库,任选一
#set_property(TARGET
# libface
# PROPERTY
# IMPORTED_LOCATION
# ${PROJECT_SOURCE_DIR}/fcsdk/FaceCapture.so)
#set_target_properties(libface
# PROPERTIES
# IMPORTED_LOCATION
# ${PROJECT_SOURCE_DIR}/fcsdk/FaceCapture.so)
参考博客:https://blog.csdn.net/houwenbin1986/article/details/78475943
查看版本
cmake --version