cmake初探

来源:互联网 发布:w7怎么添加网络打印机 编辑:程序博客网 时间:2024/06/03 16:12

在学OpenGL的时候遇到问题了:不会用cmake,只能从头学了,下面记下我在clion里学习cmake的记录:

PART_1:由最简单的HelloWorld开始

首先创建c项目,名为cmake_1_helloworld,创建后,可以看到项目结构是这样的:




可以看到clion已经为我生成CMakeLists.txt文件了,看看里面的内容和我的注释:

#cmake最低版本需求,不加入此行会受到警告信息cmake_minimum_required(VERSION 3.7)#项目名称project(cmake_1_helloworld)#设置变量CMAKE_C_STANDARD99,含义是C的标准,但好像没地方用到这个变量set(CMAKE_C_STANDARD 99)#设置变量SOURCE_FILESmain.c,下面会用到set(SOURCE_FILES main.c)#SOURCE_FILES里面的全部文件生成应用程序 cmake_1_helloworld (windows下会自动生成cmake_1_helloworld.exe)add_executable(cmake_1_helloworld ${SOURCE_FILES})#这两行是我自己加上的,作用是在终端输出工程的源代码路径和二进制文件保存路径 ,这两个变量是cmake中预定义的变量message(${PROJECT_SOURCE_DIR})message(${PROJECT_BINARY_DIR})

编译一下,终端输出如下(第3第4行就是我用message命令输出的):

"D:\CLion 2017.1.2\bin\cmake\bin\cmake.exe" --build D:\project_c\p_cmake\cmake_1_helloworld\cmake-build-debug --target cmake_1_helloworld -- -j 8
D:/project_c/p_cmake/cmake_1_helloworld
D:/project_c/p_cmake/cmake_1_helloworld/cmake-build-debug
-- Configuring done
-- Generating done
-- Build files have been written to: D:/project_c/p_cmake/cmake_1_helloworld/cmake-build-debug
[100%] Built target cmake_1_helloworld


PART_2:多个文件的项目

项目结构如下:


cmakeLists.txt(和Part_1差不多,主要就在SOURCE_FILES加多了helloworld.c):

cmake_minimum_required(VERSION 3.7)project(cmake_2_many_file)set(CMAKE_C_STANDARD 99)set(SOURCE_FILES main.c helloworld.c)add_executable(cmake_2_many_file ${SOURCE_FILES})


PART_3:生成一个静态库,链接该库

cmake_minimum_required(VERSION 3.7)project(cmake_3_static_lib)set(CMAKE_C_STANDARD 99)#这里的源码只有main.cset(SOURCE_FILES main.c)set(LIB_FILES hello.c)#生成一个静态库add_library(hello ${LIB_FILES})add_executable(cmake_3_static_lib ${SOURCE_FILES})#连接这个静态库target_link_libraries(cmake_3_static_lib hello)

PART_4:将源文件放置到不同的目录

现在我想把不同的源代码放在不同的地方,例如这样:


那么顶级的CMakeList.txt可以这样写

cmake_minimum_required(VERSION 3.7)project(cmake_4_split_src)set(CMAKE_C_STANDARD 99)add_subdirectory(src)add_subdirectory(lib)

add_subdirectory,表示告诉cmake在以下目录里找其他CMakeLists.txt文件


lib下的CMakeList.txt可以这样写,这个不解释

set(LIB_FILES hello.c)add_library(hello ${LIB_FILES})

src下的CMakeList.txt可以这样写

include_directories(${PROJECT_SOURCE_DIR}/lib)set(APP_SRC main.c)add_executable(cmake_4_split_src ${APP_SRC})target_link_libraries(cmake_4_split_src hello)
include_directories用来指明头文件所在的路径(但亲测没有这句编译也不会出错且可运行)。

生成出来的目录和文件:




PART_5:将源文件放置到不同的目录

先放效果结构图:


顶级CMakeLists:

cmake_minimum_required(VERSION 3.7)project(cmake_5_change_output_path)add_subdirectory(src)add_subdirectory(lib)

src里的CMakeLists:

link_directories(${PROJECT_BINARY_DIR}/lib)set(SOURCE_FILES main.c)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)add_executable(cmake_5_change_output_path ${SOURCE_FILES})target_link_libraries(cmake_5_change_output_path hello)
lib里的CMakeLists:

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)set(LIB_FILES hello.c)add_library(hello ${LIB_FILES})
顶级的和part_5一样,src和lib分别更改了执行文件输出路径和库的输出路径,其余的和part_5相同



PART_6:生成动态库

add_library(hello SHARED ${LIB_FILES})
把STATIC改成SHARED就行了,其他不变








原创粉丝点击