cmake——效率高跨平台的makefile生成神器
来源:互联网 发布:截面数据统计分析方法 编辑:程序博客网 时间:2024/06/03 06:29
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
1、编写 CmakeLists.txt。
2、执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt 所在的目录 )。
3、使用 make 命令进行编译。
1、单源文件目录
zjy@ubuntu:~/cmkTest$ ls
CMakeLists.txt main.cc
zjy@ubuntu:~/cmkTest$ cat main.cc
#include<iostream>
int main()
{
std::cout<<"hello"<<std::endl;
return 0;
}
zjy@ubuntu:~/cmkTest$ cat CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(main)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
zjy@ubuntu:~/cmkTest$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zjy/cmkTest
zjy@ubuntu:~/cmkTest$ ls
CMakeCache.txt cmake_install.cmake main.cc
CMakeFiles CMakeLists.txt Makefile
zjy@ubuntu:~/cmkTest$ make
Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cc.o
[100%] Linking CXX executable main
[100%] Built target main
zjy@ubuntu:~/cmkTest$ ls
CMakeCache.txt cmake_install.cmake main Makefile
CMakeFiles CMakeLists.txt main.cc
zjy@ubuntu:~/cmkTest$ ./main
hello
zjy@ubuntu:~/cmkTest$
CMakeLists.txt:
关键字正确显示橙色,错误显示黑色。
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)——限定了最小版本是2.6
PROJECT(main)——设置生成执行文件的名字为main
AUX_SOURCE_DIRECTORY(. DIR_SRCS)——将源文件目录赋值给变量DIR_SRCS,原型是aux_source_directory(<dir> <variable>)
ADD_EXECUTABLE(main ${DIR_SRCS})——将变量 DIR_SRCS 中的源文件需要编译成一个名称为 main 的可执行文件
2、多源文件目录
zjy@ubuntu:~$ tree cmkTest/
cmkTest/
├── CMakeLists.txt
├── main
├── main.cc
├── CMakeLists.txt
├── print.cc
└── print.h
1 directory, 6 files
zjy@ubuntu:~$ cd cmkTest/
zjy@ubuntu:~/cmkTest$ ls
CMakeLists.txt main main.cc print
zjy@ubuntu:~/cmkTest$ cat CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(main)
add_subdirectory( print )
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
target_link_libraries( main print)
zjy@ubuntu:~/cmkTest$ cat print/CMakeLists.txt
AUX_SOURCE_DIRECTORY(. DIR_PRINT_SRCS)
add_library(print ${DIR_PRINT_SRCS})
zjy@ubuntu:~/cmkTest$ cat print/print.cc
#include<iostream>
#include"print.h"
void print()
{
std::cout<<"hello"<<std::endl;
}
zjy@ubuntu:~/cmkTest$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zjy/cmkTest
zjy@ubuntu:~/cmkTest$ make
Scanning dependencies of target print
[ 25%] Building CXX object print/CMakeFiles/print.dir/print.cc.o
[ 50%] Linking CXX static library libprint.a
[ 50%] Built target print
Scanning dependencies of target main
[ 75%] Building CXX object CMakeFiles/main.dir/main.cc.o
[100%] Linking CXX executable main
[100%] Built target main
zjy@ubuntu:~/cmkTest$ ls -lh
total 52K
-rw-rw-r-- 1 zjy zjy 12K Aug 2 16:49 CMakeCache.txt
drwxrwxr-x 5 zjy zjy 4.0K Aug 2 16:49 CMakeFiles
-rw-rw-r-- 1 zjy zjy 1.5K Aug 2 16:49 cmake_install.cmake
-rw-rw-r-- 1 zjy zjy 177 Aug 2 16:40 CMakeLists.txt
-rwxrwxr-x 1 zjy zjy 9.2K Aug 2 16:49 main
-rw-rw-r-- 1 zjy zjy 112 Aug 2 16:36 main.cc
-rw-rw-r-- 1 zjy zjy 5.0K Aug 2 16:49 Makefile
drwxrwxr-x 3 zjy zjy 4.0K Aug 2 16:49 print
zjy@ubuntu:~/cmkTest$ ./main
hello
hello
zjy@ubuntu:~/cmkTest$
/CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(main)
add_subdirectory( print )——增加一个子目录
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
target_link_libraries( main print)——main需要一个print链接库
/print/MakeLists.txt:
AUX_SOURCE_DIRECTORY(. DIR_PRINT_SRCS)
add_library(print ${DIR_PRINT_SRCS})——增加一个print链接库
在根目录下执行"cmake .",先解析根目录下的MakeLists.txt,遇到add_subdirectory( print )后进入print目录解析/print/MakeLists.txt。
其他常用命令汇总:
include_directories(${PROJECT_SOURCE_DIR}/print)——main目录与print目录在同一层,PROJECT_SOURCE_DIR代表根目录
target_link_libraries(main print) ——执行文件main链接print链接库
set(LIB_SRC hello.c) ——设置变量set(LIB_SRC hello.c hello2.c)
add_library(libhello ${LIB_SRC})
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")——文件是hello.c如果与外面名字有冲突,可以修改为libhello
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)——设置执行文件输出目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) ——设置库文件输出目录
- cmake——效率高跨平台的makefile生成神器
- 跨平台MakeFile生成的软件--PreMake
- 使用Cmake生成makefile
- Makefile自动生成:cmake
- Makefile/cmake/node-gyp中区分不同平台的方法
- 使用cmake来生成makefile
- 用CMake代替makefile进行跨平台交叉编译
- 用CMake代替makefile进行跨平台交叉编译
- 跨平台CMake的编写
- 自动生成makefile的工具?GNU Automake;cmake;
- CMake 生成 Linux 下 Debug 版本的 Makefile 方法
- QMAKESPEC,生成不同平台的makefile
- linux下生成高强度密码的四大神器
- linux下生成高强度密码的四大神器
- linux下生成高强度密码的四大神器
- 在Linux平台上使用Cmake进行交叉编译替代嵌入式平台所使用的Makefile
- 多平台工程生成工具CMAKE如何创建VS工程组——folder属性
- 多平台工程生成工具CMAKE如何创建VS工程组——folder属性
- 第七章 优雅地断开套接字连接
- MySql 事务与锁
- QR Code二维码原理
- 关于多线程学习遇到的一些问题
- 在handler中使用SmartUpload上传组件失败
- cmake——效率高跨平台的makefile生成神器
- PC Lint 用法说明,文件的作用
- Spring Cloud 服务链路追踪 (zipkin)
- Hibernate5 Dao层基类
- 关于如何在Myeclipse中创建SpringBoot项目
- hadoop以及相关组件介绍以及个人理解
- OpenMV时间操作
- git笔记
- MySQL出现[Err] 1050