下面是一个Opencv依赖库的添加:
cmake_minimum_required( VERSION 2.8 )
project( imageBasics )
# 添加c++ 11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11" )
# 寻找OpenCV库
set(OpenCV_DIR /home/chaofan/opt/opencv-3.4.4/release)
find_package( OpenCV 3 REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( imageBasics imageBasics.cpp )
# 链接OpenCV库
target_link_libraries( imageBasics ${OpenCV_LIBS} )
上面说明了添加依赖库的主要步骤:
第一个: 添加头文件
第二个:找到源文件
第三个:与目标链接起来
下面是我的几个文件:
1hello.cpp
//hello.cpp
int Calculate_sum_Of_Two_Number(int x,int y)
{
int z=0;
z=x+y;
return (z);
}
2hello.hpp
//hello.hpp
#ifndef __HELLO_H
#define __HELLO_H
int Calculate_sum_Of_Two_Number(int x,int y);
#endif
3 main.cpp
//main.cpp
#include "hello.hpp"
#include
int main(void)
{
int a=0,b=0,c=0;
printf("please input two parameter:");
scanf("%d",&a);
scanf("%d",&b);
c=Calculate_sum_Of_Two_Number(a,b);
printf("the sum is : %d",c);
return 0;
}
4 CMakeLists.txt
#要求的Cmake最低版本
CMAKE_MINIMUM_REQUIRED( VERSION 2.8)
#工程名称
PROJECT(main)
#设置编译器编译模式:
set( CMAKE_BUILD_TYPE "Debug" )
#生成共享库
#get the shared package
#here needs no .hpp
add_library(calculate_shared SHARED hello.cpp)
#生成可以执行的文件
add_executable(main main.cpp)
#连接共享库
target_link_libraries(main calculate_shared)
上面CmakeLists.txt里面, 共享库的名称是calculate_shared,这个是我们可以自己更改的。生成的可执行文件是main, 这个名称也是可以更改的。
不过需要注意的是,hello.cpp里面不用在包含hello.hpp 了。(汗,因为这个导致出错,提示说是重复定义函数了);
编译生成:
mkdir build
cd build
cmake ..
make
我们就可以看到build生成了 如下的文件:
CMakeCache.txt cmake_install.cmake main
CMakeFiles libcalculate_shared.so Makefile
libcalculate_shared.so就是生成的共享库文件。
他们的路径是:/home/fan/dev/cmake/4-exer/
下面有build文件夹,以及main.cpp, hello.cpp, hello.hpp,
build文件夹下面有共享库 libcalculate_shared.so.so
所有的外部依赖库都是这样的,比如opencv ,openni, eigen等等,原理是一样的,只不过他们已经安装在系统里面了,可以查找,而这个则是需要我们自己去配置。
即我上面生成的共享库文件本质上和opencv的库是相同的。只不过这个共享库需要自己手动配置。
比如我又新建了一个工程,需要调用上面的共享库 libcalculate_shared.so。
main.cpp如下:
//main.cpp
#include
#include
#include "hello.hpp"
using namespace std;
int main(void)
{
int x=2,y=3;
int z=0;
z=Calculate_sum_Of_Two_Number(x,y);
cout<<"the result is:"<
那么在CMakeLists.txt里面,我需要告诉CMake, 这个头文件可以在哪里找到,头文件所定义的函数又可以在哪里找到。
上面hello.hpp的路径是:/home/fan/dev/cmake/4-exer/hello.hpp
libcalculate_shared.so的路径是/home/fan/dev/cmake/4-exer/build/libcalculate_shared.so
则CMakeLists.txt如下:
CMAKE_MINIMUM_REQUIRED( VERSION 2.8)
PROJECT(main)
#设置编译器编译模式:
SET( CMAKE_BUILD_TYPE "Debug" )
SET(HELLO_INCLUE
/home/fan/dev/cmake/4-exer/)
SET(HELLO_SRC
/home/fan/dev/cmake/4-exer/build/libcalculate_shared.so)
INCLUDE_DIRECTORIES(${HELLO_INCLUE})
add_executable(main main.cpp)
target_link_libraries(main ${HELLO_SRC})
这里要注意一些细节(对于我这个渣渣来说的)
1、${ }这种形式代表一个变量,比如上面的,HELLO_INCLUE ,就是我自己定义的一个变量。
2、头文件包含到头文件所在的文件夹,即 /home/fan/dev/cmake/4-exer/
3、共享库要指明具体的共享库 ,精确到.so
其实主要的就是指明这个调用这个共享库的时候,使用的头文件,以及共享库本身所在的位置,然后包含链接就可以了。
安装过的共享库(例如opencv)就不用这么麻烦了,因为它的地址都放在了变量里面。
比如Opencv, 它的头文件和.so文件都已经放在了系统变量里面,不用向上面自己定义了(上面例子里面的头文件和共享库文件的地址都是我自己设置的)
它的CMakeLists.txt如下:
find_package(OpenCV REQUIRED)
include_directories(${OPENCV_INCLUDE_DIRS})
target_link_libraries(MAIN ${OpenCV_LIBS})
只需要查找就可以了,OpenCV_LIBS 和 OPENCV_INCLUDE_DIRS 都是系统帮我们已经定义好的,所以比较容易
参考博客:
1、如何写自己的CmakeLists.txt https://www.cnblogs.com/chaofn/p/10160555.html
2、 【OpenCV】使用CMake链接自己路径下面的OpenCV库 https://blog.csdn.net/twt520ly/article/details/81981473