一、前言

因为机缘巧合下,需要使用windows下的cmake使用,因为本身有Linux下进行cmake,所以本篇文章做做总结。
Ninja是一种类似GNU make的编译系统。 就像make有Makefile,它也有自己的编译配置文件。 相对来说,Ninja文件没有分支、循环的流程控制,本质上就是纯粹的配置文件,所以要比Makefile简单得多。

二、Linux安装

sudo apt install cmake make ninja(相对简单,使用apt-get进行安装即可)

三、Windows环境安装

1、cmake
官网下载https://cmake.org/download/
2、gcc环境(包括make等)
这里选用mingw——https://osdn.net/projects/mingw/releases/,将mingw32-make.exe重新命名为make
3、ninja
git clone git://github.com/ninja-build/ninja.git && cd ninja
git checkout release
D:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat x64
python configure.py --bootstrap

注意: 包含文件: E:\myC++\project\autostar\ninja\src\load_status.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\deps_log.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\clean.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\debug_flags.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\disk_interface.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\graphviz.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\manifest_parser.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\parser.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\lexer.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\state.h
注意: 包含文件: E:\myC++\project\autostar\ninja\src\version.h
[32/32] LINK ninja.exe
正在生成代码
已完成代码的生成

将这些可执行程序添加到环境变量PATH中,让cmd中可执行;

四、cmake使用

1、变量引用方式
, 在 I F 等 语 句 中 , 直 接 使 用 变 量 名 而 不 通 过 {},在IF等语句中,直接使用变量名而不通过 IF使{}取值
2、cmake自定义变量的方式
隐式定义——PROJECT指令,会隐士的定义_BINARY_DIR和_SOURCE_DIR变量;
显式定义——使用SET指令,就可以构建一个自定义变量
3、常见变量定义
可查看参考:https://cmake.org/cmake/help/v3.20/manual/cmake-variables.7.html
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/…/bin) —— 设置可执行文件的输出目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/…/lib) —— 设置库文件的输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECTSOURCEDIR}/…/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORYRELEASE ${PROJECT_SOURCE_DIR}/…/bin) ——分别设置了Debug版本和Release版本可执行文件的输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECTSOURCEDIR}/…/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORYRELEASE ${PROJECT_SOURCE_DIR}/…/lib) ——分别设置了Debug版本和Release版本库文件的输
出目录
set(CMAKE_DEBUG_POSTFIX “_d”) set(CMAKE_RELEASE_POSTFIX “_r”) ——分别设置了Debug版本和Release版本下库文件的后缀名
set_target_properties(TARGETNAME PROPERTIES DEBUG_POSTFIX “_d”) set_target_properties(TARGET_NAME PROPERTIES RELEASE_POSTFIX “_r”) ——分别设置了Debug版本和Release版本下可执行文件的后缀名
CMAKE_SOURCE_DIR或PROJECT_SOURCE_DIR 表示工程的根目录
CMAKE_BINARY_DIR或PROJECT_BINARY_DIR 表示编译目录。若是是内部构建,则编译目录与工程根目录相同,若是是外部构建,则表示外部构建建立的编译目录,如上例中的build目录
CMAKE_CURRENT_SOURCE_DIR 表示当前处理的CMakeLists.txt所在文件夹的路径
CMAKE_CURRENT_LIST_FILE 当前CMakeLists.txt文件的完整路径
CMAKE_C_COMPILER和CMAKE_CXX_COMPILER 分别表示C和C++编译器的路径
PROJECT_NAME 该变量可获取project命令配置的项目名
EXECUTABLE_OUTPUT_PATH 设置该变量可修改可执行程序的生成路径 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
LIBRARY_OUTPUT_PATH 设置该变量可修改库文件生成路径 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

BUILD_SHARED_LIBS 指定默认生成的库的类型
add_executable —— 使用给定的源文件,生成一个可执行程序
add_library —— 使用给定的源文件,生成一个库(静态库或共享库)
add_subdirectory —— 添加一个子目录,该子目录也必须包含一个CMakeLists.txt文件
include_directories —— 添加头文件路径
add_definitions —— 添加编译参数
target_link_libraries/LINK_LIBRARIES(target_link_libraries (hello echo operations)) —— 连接指定的库
find_library —— 查找指定的库,并将库文件路径保存到一个变量
set_target_properties —— 设置目标的一些属性,从而改变构建方式——SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) VERSION 指代动态库版本,SOVERSION 指代 API 版本
link_directories —— 添加库的搜索路径
aux_source_directory —— 查找指定路径下的全部源文件
4、install安装
CMAKE_INSTALL_PREFIX变量——或者通过set设置
CMAKE_INSTALL_PREFIX变量是cmake的一个内置变量,它的作用和使用传统./configure安装时的–prefix= 作用是相同的,即指定文件的安装位置,在默认的情况下,该变量的位置是/usr/local/。
如果在安装时,要制定到其他位置,需要使用
cmake -DCMAKE_INSTALL_PREFIX:PATH=
安装执行文件RUNTIME
install (TARGETS hello DESTINATION bin)
其中TARGETS为固定,TARGETS后面跟多个文件,这些文件将被安装到DESTINATION指定的文件夹中,也就是bin文件夹。这里的DESTINATION也是固定用法。
安装普通头文件与此类似:
install (FILES “${PROJECT_SOURCE_DIR}/include/config.h” DESTINATION include)

不过这里使用FILES而不是TARGETS。这里我们将项目目录下include/config.h文件安装到include文件夹中。
库文件的安装
由于我们的库文件在lib文件夹下,因此对于库文件的安装可以把install()命令写在lib文件夹下的CMakeList.txt中。
在lib/CMakeLists.txt修改为如下内容:install (TARGETS operations DESTINATION lib)
5、使用 FindCURL 模块
向src/CMakeLists.txt 中添加:
FIND_PACKAGE(CURL)
IF(CURL_FOUND)
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(curltest KaTeX parse error: Expected 'EOF', got '#' at position 261: …6、语法 a. #̲注释 b. 变量…{}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值;
c. command (args …) #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格
d. set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样一个string list
e. Add_executable(KaTeX parse error: Expected 'EOF', got '#' at position 36: …table(a b c) #̲变量使用{xxx}引用
f. 条件语句:
if(var) #var 非empty 0 N No OFF FALSE… #非运算使用NOT

else()/elseif() … endif(var)
数字比较LESS、GREATER、EQUAL,字串比STRLESS、STRGREATER、STREQUAL
g. 循环语句
Set(VAR a b c)
Foreach(f ${VAR}) …Endforeach(f)
h. 循环语句
WHILE() … ENDWHILE()
i. 怎样根据OS指定编译选项
IF( APPLE ); IF( UNIX ); IF( WIN32 )

五、cmake编译

1、Makefiles方式
cmake ./ -B…/test -G"Unix Makefiles"
2、Ninja方式
cmake . -Bninja -G “Ninja”

若是提示:
CMake Error: Error: generator : Ninja
Does not match the generator used previously: Unix Makefiles
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.

原因是:在于版本不统一,之前编译过CMakeLists.txt后,产生了缓存文件CMakeCache.txt,
解决方案:删除CMakeCache.txt文件,解决。

六、参考链接

https://cmake.org/cmake/help/latest/index.html
http://blog.chinaunix.net/uid-23381466-id-3826931.html
https://www.shangmayuan.com/a/65ce1288fee24a67b6552bba.html
http://106.53.224.102:9000/note/5f5c73e40c53fe76560001db

以下是新的个人博客的地址:http://106.53.224.102:8080/wordpress-zh/feng_8071

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐