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

PART_1:由最简单的HelloWorld开始

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

cmake初探

cmake初探

cmake初探

可以看到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:多个文件的项目

项目结构如下:

cmake初探

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:将源文件放置到不同的目录

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

cmake初探

那么顶级的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用来指明头文件所在的路径(但亲测没有这句编译也不会出错且可运行)。

生成出来的目录和文件:

cmake初探



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

先放效果结构图:

cmake初探

顶级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就行了,其他不变








相关文章:

  • 2021-06-28
  • 2021-07-20
  • 2021-09-10
  • 2021-07-03
  • 2022-12-23
  • 2021-12-02
  • 2021-11-30
  • 2022-01-07
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-26
  • 2022-12-23
  • 2021-09-29
  • 2022-12-23
相关资源
相似解决方案