是来源于下面这个视频的笔记
1 添加可执行文件
我们有如下文件:
main.cpp
#include <iostream>
#include "answer1.hpp"
using namespace std;
int main()
{
int ans;
ans = answer();
cout<<"answer is "<<ans<<endl;
return 0;
}
answer.cpp
int answer()
{
return 42;
}
answer1.hpp
int answer();
然后新建CMakeLists.txt文件
cmake_minimum_required(VERSION 3.9)
project(answer)
add_executable(answer main.cpp answer.cpp)
第一句:最小版本
第二局:项目名
第三句:生成可执行文件。
构建构建系统
cmake -B build
会生成build目录,并且在下面生成构建系统(Makefile或者VS工程)
编译
cmake --build build
会调用编译器(例如VS或者gcc)进行编译。
执行
.\build\Debug\answer.exe
结果
answer is 42
说明:
- 要生成可执行文件answer,需要指定它所依赖的源文件。这是因为同一个文件夹目录下,可以有多个构建的目标。例如某5个源文件想要编译成一个库,另外5个源文件编译成一个可执行文件。
- 无需指定hpp文件。只要include头文件,CMake会自动找到对应的头文件。所以我这里特意给answer1.hpp这个名字。这证明它不是根据源文件的名字找到头文件的,而是根据include找到的。
- -G指定生成器(编译器),例如-G”Ninja“
2 构建静态库
我们把answer1.hpp改回answer.hpp
然后CMakeList.txt做如下更改
cmake_minimum_required(VERSION 3.9)
project(answer)
add_library(libanswer STATIC answer.cpp)
add_executable(answer main.cpp)
target_link_libraries(answer libanswer)
add_library(libanswer STATIC answer.cpp)
将answer.cpp编译为一个静态库,名为libanswer
target_link_libraries(answer libanswer)
将libanswer链接到可执行文件answer上
3 把库源文件挪到单独目录 add_subdirectory
把answer.cpp 和.hpp放入新建的文件夹answer中
然后在answer文件夹下添加CMakeLists
add_library(libanswer STATIC answer.cpp)
主目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.9)
project(answer)
add_subdirectory(answer)
add_executable(answer_app main.cpp)
target_link_libraries(answer_app libanswer)
main.cpp中更改
#include "answer/answer.hpp"
3 把头文件挪到单独目录
在answer目录下新建inlcude/answer
把头文件放到这里
在answer目录下的CMakeLists.txt中
add_library(libanswer STATIC answer.cpp)
target_include_directories(libanswer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
PUBLIC表示:当其他库或者可执行文件链接当前库的时候,就会自动发现该头文件