本文mark下CMake的安装,CMake是因为C与C++跨平台的差异性导致的问题的一种解决思想的实现,就是不同平台的C/C++环境安装的问题;主要内容如下:
- cmake的下载安装;
- cmake的使用模式;
- cmake的动态库的配置;
- Mac系统独有的framework库的配置;
关于CMake
- 两年不写C/C++,make的编译方式居然落伍了,出现了cmake编译脚本执行工具。
-
cmake出现的背景:
- 编译C/C++有好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。
- 问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一个灾难。
- CMake就是针对上面问题所设计的工具;
-
cmake的工作方式:
- 首先开发者编写一种平台无关的
CMakeList.txt
文件来定制整个编译流程 - 然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。
- 首先开发者编写一种平台无关的
-
cmake的应用情况:
- CMake 是一个比make 更高级的编译配置工具。
- 使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等,包括OpenGL的开源项目glfw。
CMake的下载
-
下载地址
https://cmake.org/download/
-
源代码下载
- Mac OS X内核与Unix属于同一类。
- 二进制文件下载
CMake安装
- 源代码安装
- 二进制安装比较简单,这里使用源代码安装(个人习惯:可以控制安装过程)。
- 解压
- 使用configure生成Makefile
- 由于cmake还是使用的是传统的二进制安装方式(先
configure
,再make
,最后make install
),所以需要先调用安装包下的configure工具,生成Makefile。
- 由于cmake还是使用的是传统的二进制安装方式(先
- 使用make编译
- make编译用来编译C/C++源代码,生成二进制文件;
- 使用make安装
- 安装就是把编译好的二进制文件,拷贝到系统(一般根据权限,是用户的系统目录)目录中的过程。
- 注意:使用root用安装,否则某些权限限制导致安装失败。
- 测试cmake安装是否成功
- 在任意命令行下,执行cmake --help
CMake使用模式
- 首先准备一个网络连接的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
int main(int argc, const char** argv) {
// 创建socket描述符
int sk = socket(AF_INET, SOCK_STREAM, 0);
// 构造socket地址
sockaddr_in addr;
addr.sin_family = AF_INET; // 地址族
addr.sin_port = htons(80); // 端口
inet_aton("123.125.114.144", &addr.sin_addr); // ip地址, IP地址的数点格式使用ping -c 5 baidu.com可以获取
// 链接到百度HTTP服务器
int code = connect(sk, (sockaddr*)&addr, sizeof(struct sockaddr_in));
if(code == -1){
perror("链接错误:");
exit(-1);
}
printf("链接服务器成功\n");
// 关闭链接
close(sk);
return 0;
}
- 使用VS Code的界面
- 很酷!
- 这个代码的编译连接实际很简单
g++ cmake01_cppfile.cpp -omain
- 但这里使用这个简单的方式来说明cmake的使用;
- 创建CMakeLists.txt文件,并添加三个最基本的条目:
- cmake_minimum_required:对cmake的最低版本申明;
- project:项目名;
- add_executable:制定编译的源代码与执行文件;
# cmake 最低版本需求
cmake_minimum_required(VERSION 3.15.0)
# 项目名
project (cmake_demo)
# 执行文件(把cmake01_cppfile.cpp编译成main执行文件)
add_executable(main cmake01_cppfile.cpp)
-
注意:
-
CMakeLists.txt
文件的语法比较丰富,这里仅仅说明使用;
-
- 使用cmake生成Makefile文件
为了清晰,我们把
cmake01_cppfile.cpp
与CMakeLists.txt
存放在一个单独的目录:cmake_intro
-
cmake使用命令:进入
cmake_intro
- cmake . # 其中.表示当前路径,需要指定
CMakeLists.txt
所在的目录。
- cmake . # 其中.表示当前路径,需要指定
- 使用make进行编译
- 直接使用make命令即可;
- 执行后创建main执行文件
cmake配置文件语法入门介绍
-
官方语法参考地址:
https://cmake.org/cmake/help/v3.15/
-
全部版本的参考文档地址:
https://cmake.org/documentation/
-
注意:
- 参数太多,下面捡需要用到的说明。
使用动态库连接
方案1
- 使用
link_directories(/usr/local/lib/)
添加库目录;
- 在
target_link_libraries(main GLEW GLFW "-framework opengl")
中指定库名;
方案2
使用
find_library(GLEW_LIBRARY glew)
查找库目录,并缓存到GLEW_LIBRARY变量;在
target_link_libraries(main ${GLEW_LIBRARY} ${GLFW_LIBRARY} ${OPENGL_LIBRARY})
中使用GLEW_LIBRARY变量。
使用mac系统的framework
方式1
- 直接在
target_link_libraries(main GLEW GLFW "-framework opengl")
指定-framework opengl
方式2
- 与动态库使用方式一样
使用
find_library(GLEW_LIBRARY glew)
查找库目录,并缓存到GLEW_LIBRARY变量;在
target_link_libraries(main ${GLEW_LIBRARY} ${GLFW_LIBRARY} ${OPENGL_LIBRARY})
中使用GLEW_LIBRARY变量。
使用例子
例子1
# cmake 最低版本需求
cmake_minimum_required(VERSION 3.15.0)
# 项目名
project (cmake_demo)
include_directories(/usr/local/include/)
link_directories(/usr/local/lib/)
# 执行文件(把cmake01_cppfile.cpp编译成main执行文件)
add_executable(main gl01_01gl_env.cpp)
# 添加链接库
target_link_libraries(main GLEW GLFW "-framework opengl")
例子2
# cmake 最低版本需求
cmake_minimum_required(VERSION 3.15.0)
# 项目名
project (cmake_demo)
include_directories(/usr/local/include/)
# 执行文件(把cmake01_cppfile.cpp编译成main执行文件)
add_executable(main gl01_01gl_env.cpp)
# 添加链接库
find_library(OPENGL_LIBRARY opengl)
find_library(GLEW_LIBRARY glew)
find_library(GLFW_LIBRARY glfw)
target_link_libraries(main ${GLEW_LIBRARY} ${GLFW_LIBRARY} ${OPENGL_LIBRARY})