一.单项目(即最终只有一个可执行文件)
1.创建对应文件夹和文件
文件结构如下:
代码如下:
//main.cpp
#include <head.h>
int main(){
int a=add(5,6);
int b=sub(2,1);
return 0;
}
//add.cpp
#include<head.h>
int add(int a,int b){
return a+b;
}
//sub.cpp
#include<head.h>
int sub(int a,int b){
return a-b;
}
//head.h
int add(int a,int b);
int sub(int a,int b);
2.我们想简单的在main函数中
(1)指定头文件位置
(2)与add.cpp,sub.cpp联合编译
(3)输出文件到/bin目录下
应该怎么快速通过cmake生成编译命令?
3.将所有文件包括到SRC_LIST
file(GLOB_RECURSE SRC_LIST *.cpp)
4.指定头文件位置
include_directories(./include)
5.得到可执行文件
add_exectuable(output ${SRC_LIST})
6.文件构建如下:
7.启动生成的解决方案,将我们的项目设置为启动项目,点击本地windows调试器,即可编译和运行代码。
二.多项目(最终有多个执行文件或库文件)
稍微更改文件结构,将每个项目的东西放在每个单独的文件夹。这次不仅要在bin目录下生成执行文件,还要在lib库下生成add.cpp和sub.cpp的库文件。
1.先在根目录下确定:
(1)输出执行文件路径的名字
(2)头文件路径的名字
(3)输出库文件路径的名字
(4)告诉cmake有哪些子目录
编辑文件根目录的CMakeLists.txt后结果如下:
2.在每个项目里单独编写CMakeLists.txt决定此项目的编译规则。
cmake_minimum_required(VERSION 3.0)
project(calc)
set(CMAKE_CPP_STANDARD 11)
include_directories(${HEAD_PATH})
set(LIBRARY_OUTPUT_PATH ${LIB_PATH})
add_library(calc STATIC add.cpp sub.cpp)
cmake_minimum_required(VERSION 3.0)
project(main)
set(CMAKE_CPP_STANDARD 11)
include_directories(${HEAD_PATH})
set(EXECUTABLE_OUTPUT_PATH ${EXEC_PATH})
link_libraries(calc)
add_executable(main main.cpp)
3.在根目录运行命令cmake .即可得到支持visual studio的解决方案,打开后将main设置为工作目录,点击调试器即可自动编译并调试运行。
三.如何用find_package引入外部库
举个例子,假如我们想要在源文件里加入外部库boost,需要引入头文件和库文件(boost库比较特殊只需引入头文件即可)
有两种好一点的方法:
(1)
项目>属性>配置属性>C/C++>附加包含目录 添加头文件
项目>属性>配置属性>链接器>附加库目录 添加库目录
项目>属性>配置属性>链接器>输入>附加依赖项 添加库
(2)配置对应的环境变量 直接在上面的对应位置添加
(
I
N
C
L
U
D
E
)
,
(INCLUDE),
(INCLUDE),(LIB)即可以,当然,添加库的名字还是要写的。
用find_package直接找即可。
find_package(Boost)
(当然还有其他命令选项)
其中头文件目录会定义到
B
o
o
s
t
I
N
C
L
U
D
E
D
I
R
S
中库文件会定义到
{Boost_INCLUDE_DIRS}中 库文件会定义到
BoostINCLUDEDIRS中库文件会定义到{Boost_LIBS}
之后只需要在include_directories包含Boost_INCLUDE_DIRS
target_link_libraries(main ${Boost_LIBS})即可。
库文件目录会自动构建,不用手动指定
(3)对于常用库 可以不指定cmake文件的位置,CMake\share\cmake-3.27\Modules中都有,会自动寻找。对于此目录没有对应库文件的情况,需要指定变量BOOST_ROOT(需要大写)
set(BOOST_ROOT E:/c++_library/boost_1_82_0/tools/cmake/config)
project(test)
set(CMAKE_CPP_STANDARD 11)
set(HEAD_PATH ${PROJECT_SOURCE_DIR}/include)
set(LIB_PATH ${PROJECT_SOURCE_DIR}/lib)
set(EXEC_PATH ${PROJECT_SOURCE_DIR}/bin)
set(BOOST_ROOT E:/c++_library/boost_1_82_0/tools/cmake/config)
find_package(Boost)
message(STATUS "test1 ${Boost_DIR}")
message(STATUS "test2 ${Boost_INCLUDE_DIRS}")
message(STATUS "test3 ${Boost_LIBS}")
add_subdirectory(calc)
add_subdirectory(main)
参考资料:
https://blog.csdn.net/itworld123/article/details/128671771(主要是find_package查找的匹配规则)
https://blog.csdn.net/qq_39466755/article/details/130912344(主要是find_package实例应用)