CMake补充
1、对于我们项目中好多头文件和源文件要包含进来时,我之前用set({SRC} ……………………)
但是这样不好,依旧会写一堆,所以可以这样做
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
这样就可以把src文件夹下所有的源文件都赋值给${SRC}了
当然头文件也是一样:
include_directories(${PROJECT_SOURCE_DIR}/include)
这代表包含当前include文件夹下所有的头文件
2、我们平时用CMake来生成可执行文件、静态库文件、动态库文件,下面依次是对于生成这3个文件的命令:
可执行文件:add_executeable(app ${SRC})----最后生成的是名为app的可执行文件,当然SRC是我们之前set成的好多文件的集合
静态库文件:add_library(app STATIC ${SRC})----最后根据不同的系统生成对应的静态库文件
动态库文件:add_library(app SHARED ${SRC})----最后根据不同的系统生成对应的动态库文件
这里需要说一下
我们在使用这些cmake出来的库文件时,本质是源代码,只不过是被编译好的二进制文件了
只有源代码是不能用的,所以我们使用时当然还是要搭配头文件才可以
我们当然也可以指定库文件生成的位置
set(LIBRARY_OUTPUT_PATH "……")
3、当我们需要导入外部的库文件时,比如静态库和动态库
我们就需要首先引入对应的头文件--target_include_directories(写入头文件路径)
之后进行链接---target_link_directories(自己的库的地址,例如"${PROJECT_SOURCE_DIR}/thirdparty/MedicalLib/lib/MedicalLib.lib")
这里说明一下:这两个命令都是要写在文件的最后,不可以先执行这两个命令,然后再add_executeable(app ${SRC}),必须先生成可执行文件,然后再链接库
4、静态库和动态库的区别
当我们链接静态库时,会在add_executable()的时候把静态库加载进来,直接占用内存
而动态库不同,开始不会直接加载到进程中占用内存,只有当我们调用这个动态库时它才会加载到内存中占据内存
5、CMake中可以类似于log日志一样,打印一些日志
message(状态 "…………"),这个状态可以不写--代表特别重要,可以为STATUS--代表重要程度一般般,可以为FATAL_ERROR--代表特别严重的错误,而且cmake到这里就会停下
6、CMake中对字符串进行追加、删除(比如平时包含一些文件名称时,链接库时要统一包含某个目录下的文件,但有的文件不用,那我们就可以把这个文件名从${SRC}中移去)
拼接时可以用set命令,set(TEMP main.cpp),set(TEMP1 ${TEMP} congifure.cpp),这样就把main.cpp,configure.cpp都设置为TEMP1了
或者用list命令,list(APPEND TEMP "1" "2" "JSON.cpp"),这样我们就把TEMP字符串拼接上了"12JSON.cpp"了
同样也可以删除,list(REMOVE_ITEM TEMP ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp),这样就把TEMP中main.cpp的路径删除掉了
浙公网安备 33010602011771号