【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries的含义...

include_directories(${cppzmq_INCLUDE_DIR})  //添加包含文件的的目录

add_executable(sample_project ${SOURCE_FILES})                              //要用${SOURCE_FILES}指定的文件,生成可执行文件sample_project 
target_link_libraries (sample_project  ${CMAKE_THREAD_LIBS_INIT})  //生成可执行文件sample_project 需要连接 ${CMAKE_THREAD_LIBS_INIT}指定的库

add_library(libsugan ${SRC_LISTS})    #将${SRC_LISTS}指定的所有的源文件生成一个库,名字叫libsugan
target_link_libraries(libsugan                 
    ${OpenCV_LIBS}
    ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
    ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)#生成libsugan库需要链接 ${OpenCV_LIBS}、 ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so、${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
原文链接:https://blog.csdn.net/bandaoyu/article/details/115165199

CMake: 1-CMakeLists生成和添加依赖库

https://blog.csdn.net/qq_37761077/article/details/88750711

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} )

上面说明了添加依赖库的主要步骤:

第一个: 添加头文件

第二个:找到源文件

第三个:与目标链接起来

若工程中需要指定不同版本的opencv,则可以按照一下方法操作:

1.指定库路径

file(GLOB_RECURSE Opencv3.0_LIB "/home/LiuMC/software/third_lib/opencv3.0-install/lib/*.so")

2.指定头文件路径

set(Opencv3_INLCUDE_DIRS "/home/LiuMC/software/third_lib/opencv3.0-install/include")

3.添加头文件到工程

include_directories(include
    ${Opencv3_INLCUDE_DIRS}
  )

4.添加库文件到工程

target_link_libraries(rovioLib  ${Opencv3.0_LIB})


注意:为了避免不必要的麻烦,尽量将头文件和库文件加再第一项,如:

target_link_libraries(rovioLib  
    ${Opencv3.0_LIB}
    ${Opencv3.0_HAL_LIB}
    ${catkin_LIBRARIES}
    )

原文链接:https://blog.csdn.net/liumingchun13/article/details/77089577

link_libraries(dcn_v2_cuda_forward_v2) 和target_link_libraies的区别?

简单例子:

一、生成.so共享库文件
下面是我的几个文件:

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:"<    return 0;
}
那么在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的依赖添加
比如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
原文链接:https://blog.csdn.net/qq_37761077/article/details/88750711

add_library,target_link_libraries,set_target_properties,target_link_libraries使用联系

https://blog.csdn.net/michaelhan3/article/details/69568362


折腾了半下午,终于知道这个货是怎么个关系了。在此写下记录,希望遇到同样问题的同学,不要再次浪费时间了。

首先我是在Linux环境下
先列出我的CmakeLists.txt

注意,在CmakeLists.txt 里,注释用的是#

project(Camera_sugan)         #工程名字
cmake_minimum_required(VERSION 2.6)    #编译最低cmake版本
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )   #设置c++编译器

find_package(OpenCV REQUIRED)    #在整个电脑上找opencv包

include_directories(                                 #包含头文件路径
    ./include/inudev/
    ./src/
)

set(SRC_LISTS                                          #将所有的源文件列为一个集合,集合名字叫做SRC_LISTS
    ./src/inuitive.cpp
    ./src/runCamera_Qfeeltech.cpp
)

add_library(libsugan ${SRC_LISTS})    #将集合里的所有的源文件生成一个静态库,该静态库的名字libsugan,注意,在整个CmakeLists里都要用libsugan这个

                                                                        #名字来代替之前那个集合生成的库。
target_link_libraries(libsugan                  #链接静态库需要的依赖库
    ${OpenCV_LIBS}
    ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
    ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)
#到此为止就在程序中生成了一个名字为libsugan的静态库,但是我们知道Linux下对库的存储格式是lib+name.a,所以我们生成的静态库名字为libsugan,那么

#存储出来的结果就是liblibsugan.a,看着很别扭,为了大众点,我们用下面这句,保证了存储出来的静态库叫做libsugan.a,

#但是请千万注意,在整个CmakeLists.txt里

#如果想链接生成的这个库必须使用    “add_library(libsugan ${SRC_LISTS})”指明的名字。
set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")

add_executable(demo ./src/main.cpp)
target_link_libraries(demo libsugan)

————————————————
版权声明:本文为CSDN博主「michaelhan3」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/michaelhan3/article/details/69568362

你可能感兴趣的:(opencv,c++,算法,人工智能,计算机视觉)