CMAKE
0、CMake
CMake中,我们先输入cmake 命令对工程进行分析,生成makefile文件;
然后用make命令根据makefile内容编译整个工程。
1、可执行文件
含有main函数的可以编译成可执行文件;增加可执行文件可以通过添加如下代码实现:

2、库文件
没有main的函数,即无可执行函数。

3、包含头文件
当头文件不在当前目录时,CMake中添加头文件路径,在参数中把所有需要添加的路径,对应的函数叫include。

4、头文件和库文件的关系
[ 例子 ]
假如写了代码:main.cpp func1.h func1.cpp func2.h func2.cpp
cmake处理后:main.cpp->main.exe func1.cpp->func1.a func2.cpp->func2.a;两个头文件保留作为指引,将它们链接起来。
最终我们运行程序只需要:main.exe func1.h func1.a func2.h func2.a
由此可见,cmake实际上的作用是隐藏了源代码,并链接了可执行程序和库文件。
只要有头文件(.h)和库文件(.a .so)就可以调用库了,中间函数的cpp文件可以省略。
库文件通过头文件向外导出接口。用户通过头文件找到库文件中函数实现的代码从而把这段代码链接到用户程序中去。
5、cmakelist结构

也可参照
CODEING:linux开发 中的 编译:cmake和find_package
外部依赖库的使用
A、自己写的库
一、编译库时
以下为例
目录结构为


注意include头文件目录(如果不在当前目录),然后add_library,如果是动态库就加上SHARED字段
二、使用库时

然后需要使用这个库的程序,link_directories(${PROJECT_SOURCE_DIR}/out) # 指定静态库搜索路径,
最后链接一下就好,不需要(实际上用了也找不到)用find_package,方法也就如上所述。
这里之所以要link,因为生成的静态库在第一步指定的路径(也就不是当前文件夹),所以用link指定一下搜索路径,相当于LD_PATH做的事。
也可以用这种方法:

注意这是find_library而不是find_package
在指定路径下查找指定的库,并将查找到的库的路径存储在<VAR>中。例如,本例中,将’${PROJECT_SOURCE_DIR}/out/libadd_static.a’存储在变量’dy_lib’中。
B、而下载安装的第三方库,
一般用find_package都能找到,并且cmakelist中这么写:

注意要liclude并且链接
例如加入opcv库
cmake_minimum_required(VERSION 3.0.0)
project(opencvTest VERSION 0.1.0) %取个名字
# 寻找OpenCV库
find_package( OpenCV REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable(opencvTest main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
# 链接OpenCV库
target_link_libraries( opencvTest ${OpenCV_LIBS} )
而如果find_package找不到,直接自己去usr里用查找库的方式找到.so(大多数情况)或.a(少数情况)的路径,然后用加入自己写的库的方式就好
大型项目组织
若有需要,参见
https://blog.csdn.net/weixin_43708622/article/details/108232942
网友评论