在学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_STANDARD为99,含义是C的标准,但好像没地方用到这个变量 set(CMAKE_C_STANDARD 99) #设置变量SOURCE_FILES为main.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.c了 set(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就行了,其他不变