VS code环境下使用CMake构建工程
文章目录
- VS code环境下使用CMake构建工程
- 1. C/C++多文件工程构建
- 2. 制作静态/动态链接库文件
- 3. 使用外部库文件构建工程
- 4. CMake常用指令
- 5. 填坑
本文主要介绍vscode环境下使用CMake构建工程的详细用法,包含多文件工程的构建,静态链接库/动态链接库文件的生成,外部库文件的使用。
1. C/C++多文件工程构建
工程目录结构如下,将头文件放在include中,.c文件放在src目录下,每一个包含源文件(.c/.cpp)的文件夹如果工程需要使用,则都需要通过add_subdirectory
的方式添加到工程中。项目的根目录下需要有一个CMakeLists.txt
,用来配置工程信息,建立和子目录的联系,每一个包含源码的子目录也都需要一个CMakeLists.txt
。
D:.│CMakeLists.txt│main.c├─build├─include│hello.h└─srcCMakeLists.txthello.c
在工程目录下mian.c
文件中调用src
文件下的hello.c
文件中的函数
将hello.h
文件放在include
文件夹中
工程中的CMakeLists.txt
文件如下
cmake_minimum_required(VERSION 3.0.0)project(multiFileTest VERSION 0.1.0)include(CTest)enable_testing()#包含头文件include_directories(include)#工程目录下的原文件,命名为ROOT_SOURCEaux_source_directory(. ROOT_SOURCE)#指定一个子目录src,制定了src,cmake才回去src中找CMakeListadd_subdirectory(src)#添加可执行文件,生成一个目标文件,取名为helloadd_executable(hello ${ROOT_SOURCE} ${HELLO_SRC})set(CPACK_PROJECT_NAME ${PROJECT_NAME})set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})include(CPack)
src
子目录下的CMakeLists.txt
内容如下
#子目录下的源文件,取名为HELLO_SRC,让父级目录可见aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} HELLO_SRC)set(HELLO_SRC ${HELLO_SRC} PARENT_SCOPE)
2. 制作静态/动态链接库文件
工程目录结构如下
D:.│CMakeLists.txt├─build└─libCMakeLists.txtmyhello.cmyhello.h
把hello.c
和hello.h
编译成静态和动态链接库文件,供外部使用
工程目录下的CMakeLists.txt
内容如下,只用包含注释的两句话是必要的,后面的install可安装也可不安装:
cmake_minimum_required(VERSION 3.0.0)#工程设置project(myhello VERSION 0.1.0)include(CTest)enable_testing()#包含源文件,生成的可执行文件放在bin文件中add_subdirectory(lib bin)set(CPACK_PROJECT_NAME ${PROJECT_NAME})set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})include(CPack)install(FILES hello.h DESTINATION include/hello)install(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
lib目录下的CMakeLists.txt
内容如下,同时生成动态库和静态库:
set(LIB_SRCmyhello.c)add_library(hello_staticSTATIC ${LIB_SRC})set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello" )set_target_properties( hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1 )add_library(hello SHARED ${LIB_SRC})set_target_properties(hello PROPERTIES OUTPUT_NAME "hello")set_target_properties( hello PROPERTIES CLEAN_DIRECT_OUTPUT 1 )
这个实例是使用C文件做的库,在C++中调用,.c和.h文件内容如下
//.c文件如下#include"myhello.h"#includevoidhelloFun(){printf("helloWorld!");}//.h文件如下#ifndef_MYHELLO_H#define_MYHELLO_H#ifdef__cplusplusextern "C"{ #endifexternvoidhelloFun(void);#ifdef__cplusplus}#endif#endif
编译链接之后生成了libhello.a
和libhello.dll
3. 使用外部库文件构建工程
工程目录结构如下:
D:.│CMakeLists.txt│main.cpp├─build├─include│myhello.h└─liblibhello.alibhello.dll
工程目录下的main.cpp内容如下:
#include #include "myhello.h"int main(int, char**) {helloFun();}
工程目录下的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.0.0)project(mytest VERSION 0.1.0)include(CTest)enable_testing()include_directories(include)set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)LINK_DIRECTORIES(lib)add_executable(mytest main.cpp)target_link_libraries(mytest libhello.dll)set(CPACK_PROJECT_NAME ${PROJECT_NAME})set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})include(CPack)
4. CMake常用指令
#设置最低cmake版本cmake_minimum_required(VERSION 3.0.0)#配置项目信息project(mytest VERSION 0.1.0)#搜索当前目录下所有源文件aux_source_directory(. ROOT_SOURCE)#包含头文件include_directories(include)#包含链接库目录LINK_DIRECTORIES(lib)#包含工程子目录add_subdirectory(src)#生成可执行文件add_executable(mytest main.cpp)#生成静态链接库add_library(hello_staticSTATIC ${LIB_SRC})#生成动态链接库add_library(hello SHARED ${LIB_SRC})#链接库文件,注意链接库文件必须在生成可执行文件之后target_link_libraries(mytest libhello.dll)#配置编译类型set(CMAKE_BUILD_TYPE Debug)
5. 填坑
在vscode下使用CMake构建工程,使用cmake quick start之后,自动生成了main.cpp
文件,CMakeLists.txt
文件和build
文件夹,在构建工程的过程中不要删除build文件夹,如果删除之后重新建build文件夹,然后cmake…,则会出现错误:
The CMAKE_C_COMPILER:clis not a full path and was not found in the PATH.
编译器找不到了,这是则需要重新配置cmake工程,右键CMakeLists.txt,清除项目重新配置即可
调试过程中,在build文件下编译链接,不要删除build文件夹的内容
使用外部链接库文件时,如果提示使用的函数未定义,检查目标文件是否链接库target_link_libraries
undefined reference to .......
如果提示找不到库,检查库文件路径是否包含,LINK_DIRECTORIES
cannot find -lhello ......
找不到头文件,检查头文件是否包含
No such file or directory #include "myhello.h"^~~~~~~~~~~
_link_libraries`
undefined reference to .......
如果提示找不到库,检查库文件路径是否包含,LINK_DIRECTORIES
cannot find -lhello ......
找不到头文件,检查头文件是否包含
No such file or directory #include "myhello.h"^~~~~~~~~~~