cmake中添加引用动态链接和静态链接库

ADD_EXECUTABLE(a.out ./main.cpp)
TARGET_LINK_LIBRARIES(a.out /usr/lib/libeg.so)

动态库的添加:

link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
target_link_libraries(project_name -lmxnet ) #添加libmxnet.so
静态库的添加:

add_library(mxnet STATIC IMPORTED)
set_property(TARGET mxnet PROPERTY IMPORTED_LOCATION /path/to/libmxnet.a)
target_link_libraries(project_name mxnet ) #添加libmxnet.a

# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )# 声明一个 cmake 工程
project(useHello)# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )# VAR变量代表找到的库全路径,包含库文件名
#FIND_LIBRARY(libhello_shared /home/ubuntu/ch2/useHello)#buginclude_directories (${useHello_SOURCE_DIR})
MESSAGE(${useHello_SOURCE_DIR})#${PROJECT_SOURCE_DIR}#增加src为link目录w-1
# link_directories(${PROJECT_SOURCE_DIR})#${PROJECT_SOURCE_DIR}
# MESSAGE(${PROJECT_SOURCE_DIR})
#增加src为link目录w-2
# link_directories("/home/ubuntu/ch2/useHello")
link_directories(/home/ubuntu/ch2/useHello)# "/"=/ 引号 可有可无
# 添加一个可执行程序add_executable(useHello useHello.cpp )
# 将库文件链接到可执行程序上
# target_link_libraries( useHello hello)
# target_link_libraries( useHello hello_shared )# w-1
target_link_libraries( useHello -lhello)#hello_shared=lhello # w-2

#增加src为link目录  link_directories

# 将库文件链接到可执行程序上 target_link_libraries

#增加src为link目录w-1
link_directories(${PROJECT_SOURCE_DIR})#${PROJECT_SOURCE_DIR}
# MESSAGE(${PROJECT_SOURCE_DIR})
#增加src为link目录w-2
# link_directories("/home/ubuntu/ch2/useHello")
link_directories(/home/ubuntu/ch2/useHello)# "/"=/ 引号 可有可无  # 添加一个可执行程序
add_executable(useHello useHello.cpp )
# 将库文件链接到可执行程序上
# target_link_libraries( useHello hello)
target_link_libraries( useHello hello_shared )# w-1
# target_link_libraries( useHello -lhello)#hello_shared=lhello # w-2

target_link_libraries与link_libraries 区别

target_link_libraries(useHello /home/ubuntu/ch2/useHello/libhello_shared.so)
# target_link_libraries(useHello "/home/ubuntu/ch2/useHello/libhello_shared.so")
# link_libraries(useHello "/home/ubuntu/ch2/useHello/libhello_shared.so")#bug
# link_libraries(useHello /home/ubuntu/ch2/useHello/libhello_shared.so)#bug #undefined reference to `printHello()

路径错误

target_link_libraries 全路径,绝对路径

路径错误提示bug(路径拼写错误) “”  ""  ‘’英文双引号  或不加引号

#bug #undefined reference to `printHello()
#bug  #/usr/bin/ld: cannot find -l“home/ubuntu/ch2/usehello/libhello_shared.so”
In function `main':useHello.cpp:6: undefined reference to `printHello()'

LINK_LIBRARIES (添加需要链接的库文件路径,注意这里是全路径)
List of direct link dependencies.

比如:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

也可以写成:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

————————————————————————————————————————

TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)
语法:TARGET_LINK_LIBRARIES(targetlibrary1 <debug | optimized> library2 ..)

比如(以下写法(包括备注中的)都可以): 
TARGET_LINK_LIBRARIES(myProject hello),连接libhello.so库
TARGET_LINK_LIBRARIES(myProject libhello.a)
TARGET_LINK_LIBRARIES(myProject libhello.so)

再如:
TARGET_LINK_LIBRARIES(myProject libeng.so)  #这些库名写法都可以。
TARGET_LINK_LIBRARIES(myProject eng)
TARGET_LINK_LIBRARIES(myProject -leng)

与add_executable相对位置

LINK_LIBRARIES (添加需要链接的库文件路径,注意这里是全路径) 在add_executable前面位置

target_link_libraries 可以在add_executable后面位置

一个简单的示例

一个简单的示例(以下CMakeLists.txt效果相当,在ubuntu 12.04 + g++4.6下测试编译通过):

方式一:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
include_directories("/opt/MATLAB/R2012a/extern/include")
 
#directly link to the libraries.
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
 
#equals to below
#LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
 
add_executable(myProject main.cpp)

link_libraries("/home/ubuntu/ch2/useHello/libhello_shared.so")#前
# 添加一个可执行程序
add_executable(useHello useHello.cpp )

方式二:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
include_directories("/opt/MATLAB/R2012a/extern/include")
 
LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")
 
add_executable(myProject main.cpp)
 
target_link_libraries(myProject eng mx)
 
#equals to below
#target_link_libraries(myProject -leng -lmx)
#target_link_libraries(myProject libeng.so libmx.so)

add_executable(useHello useHello.cpp )
# 将库文件链接到可执行程序上
target_link_libraries( useHello hello)#后
# target_link_libraries( useHello hello_shared )# w-1
# target_link_libraries( useHello -lhello)#hello_shared=lhello # w-2

---------------------

link_directories

#增加src为link目录w-1
# link_directories(${PROJECT_SOURCE_DIR})#${PROJECT_SOURCE_DIR}
# MESSAGE(${PROJECT_SOURCE_DIR})
#增加src为link目录w-2
# link_directories("/home/ubuntu/ch2/useHello")
# link_directories(/home/ubuntu/ch2/useHello)# "/"=/ 引号 可有可无   

link_directories, LINK_LIBRARIES, target_link_libraries使用总结

INCLUDE_DIRECTORIES(添加头文件目录)
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用(这里特指c++。c和Java中用法类似)。

比如:
include_directories("/opt/MATLAB/R2012a/extern/include")

export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:$MATLAB/extern/include

LINK_DIRECTORIES(添加需要链接的库文件目录)
语法:
link_directories(directory1 directory2 ...)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

比如:
LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64

LINK_LIBRARIES (添加需要链接的库文件路径,注意这里是全路径)
List of direct link dependencies.

比如:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

也可以写成:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)
语法:TARGET_LINK_LIBRARIES(targetlibrary1 <debug | optimized> library2 ..)

比如(以下写法(包括备注中的)都可以): 
TARGET_LINK_LIBRARIES(myProject hello),连接libhello.so库
TARGET_LINK_LIBRARIES(myProject libhello.a)
TARGET_LINK_LIBRARIES(myProject libhello.so)

再如:
TARGET_LINK_LIBRARIES(myProject libeng.so)  #这些库名写法都可以。
TARGET_LINK_LIBRARIES(myProject eng)
TARGET_LINK_LIBRARIES(myProject -leng)
-----------------

FIND_PACKAGE

hello ---he  hell 不完整 错误提示

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
HELLO_LIB
    linked by target "useHello" in directory /home/ubuntu/ch2/useHello

-- Configuring incomplete, errors occurred!

FIND_LIBRARY

# VAR变量代表找到的库全路径,包含库文件名
FIND_LIBRARY(HELLO_LIB hello /usr/lib /home/ubuntu/ch2/useHello /usr/local/lib  NO_DEFAULT_PATH)
link_libraries(${HELLO_LIB})# 添加一个可执行程序
add_executable(useHello useHello.cpp )

直接链接库目录路径

# 链接库目录路径
link_directories(${PROJECT_SOURCE_DIR})#${PROJECT_SOURCE_DIR}# 添加一个可执行程序
add_executable( useHello useHello.cpp )
# 将库文件链接到可执行程序上
target_link_libraries( useHello hello_shared )

find_package

FIND_PACKAGE( <name> [version] [EXACT] [QUIET] [NO_MODULE] [ [ REQUIRED | COMPONENTS ] [ componets... ] ] )

用来调用预定义在 CMAKE_MODULE_PATH 下的 Find<name>.cmake 模块。

也可以自己定义 Find<name>模块,将其放入工程的某个目录中,通过 SET(CMAKE_MODULE_PATH dir)设置查找路径,供工程FIND_PACKAGE使用。

这条命令执行后,CMake 会到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findname.cmake 并执行。

区分FIND_LIBRARY        https://blog.csdn.net/KYJL888/article/details/78860077

没有通过 cmake 生成供find_package使用的自定义模块

https://blog.csdn.net/KYJL888/article/details/85113221

--------------——————————————————————————————————

如果想灵活一点,不把库的路径写死,那就类似这样(libeg.so):

FIND_PACKAGE(eg REQUIRED)
IF (EG_FOUND)
    INCLUDE_DIRECTORIES(${EG_INCLUDE_DIRS})
    SET(DEPLIBS ${DEPLIBS} ${EG_LIBRARIES})
ENDIF ()

# 下面可以有好多个FIND_PACKAGE(...)

ADD_EXECUTABLE(a.out ./main.cpp)
TARGET_LINK_LIBRARIES(a.out ${DEPLIBS})

当然这是需要FindXXX.cmake文件支持的,cmake自带了一些(cmake --help-module-list),没有的话需要自己写

CMake支持大写、小写、混合大小写的命令。

1. 添加头文件目录INCLUDE_DIRECTORIES

语法:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

include_directories(../../../thirdparty/comm/include)

2. 添加需要链接的库文件目录LINK_DIRECTORIES

语法:

link_directories(directory1 directory2 ...)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

link_directories("/home/server/third/lib")

3. 查找库所在目录FIND_LIBRARY

语法:

A short-hand signature is:find_library (<VAR> name1 [path1 path2 ...])
The general signature is:find_library (<VAR>name | NAMES name1 [name2 ...] [NAMES_PER_DIR][HINTS path1 [path2 ... ENV var]][PATHS path1 [path2 ... ENV var]][PATH_SUFFIXES suffix1 [suffix2 ...]][DOC "cache documentation string"][NO_DEFAULT_PATH][NO_CMAKE_ENVIRONMENT_PATH][NO_CMAKE_PATH][NO_SYSTEM_ENVIRONMENT_PATH][NO_CMAKE_SYSTEM_PATH][CMAKE_FIND_ROOT_PATH_BOTH |ONLY_CMAKE_FIND_ROOT_PATH |NO_CMAKE_FIND_ROOT_PATH])

例子如下:

FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)

cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH

4. 添加需要链接的库文件路径LINK_LIBRARIES

语法:

link_libraries(library1 <debug | optimized> library2 ...)
# 直接是全路径
link_libraries(“/home/server/third/lib/libcommon.a”)
# 下面的例子,只有库名,cmake会自动去所包含的目录搜索
link_libraries(iconv)# 传入变量
link_libraries(${RUNTIME_LIB})
# 也可以链接多个
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

可以链接一个,也可以多个,中间使用空格分隔.

5. 设置要链接的库文件的名称TARGET_LINK_LIBRARIES 

语法:

target_link_libraries(<target> [item1 [item2 [...]]][[debug|optimized|general] <item>] ...)
# 以下写法都可以:
target_link_libraries(myProject comm)       # 连接libhello.so库,默认优先链接动态库
target_link_libraries(myProject libcomm.a)  # 显示指定链接静态库
target_link_libraries(myProject libcomm.so) # 显示指定链接动态库# 再如:
target_link_libraries(myProject libcomm.so)  #这些库名写法都可以。
target_link_libraries(myProject comm)
target_link_libraries(myProject -lcomm)

6. 为工程生成目标文件
语法:

add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL]source1 [source2 ...])

简单的例子如下:

add_executable(demomain.cpp
)

6. 最后贴一个完整的例子

cmake_minimum_required (VERSION 2.6)INCLUDE_DIRECTORIES(../../thirdparty/comm)FIND_LIBRARY(COMM_LIB comm ../../thirdparty/comm/lib NO_DEFAULT_PATH)
FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)link_libraries(${COMM_LIB} ${RUNTIME_LIB})ADD_DEFINITIONS(
-O3 -g -W -Wall-Wunused-variable -Wunused-parameter -Wunused-function -Wunused-Wno-deprecated -Woverloaded-virtual -Wwrite-strings-D__WUR= -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DTIXML_USE_STL
)add_library(lib_democmd.cppglobal.cppmd5.cpp
)link_libraries(lib_demo)
add_executable(demomain.cpp
)# link library in static mode
target_link_libraries(demo libuuid.a)
另外,使用cmake生成makefile之后,make edit_cache可以编辑编译选项。不熟悉的命令可以去查找文档,贴个cmake3.0官方帮助文档地址
https://cmake.org/cmake/help/v3.0/index.html

【学习cmake】cmake如何使用链接库 (link_directories, LINK_LIBRARIES, target_link_libraries,FIND_PACKAGE)实践篇2相关推荐

  1. ios 编译链接库问题

    一.场景 最近在集成数据库sqlite开发,在集成的过程中,需要加入库文件支持libsqlite3,  在添加这个库的时候也遇到过一个坑: 在usr/lib 目录下: ​ 千万不要被上面那个3.0.d ...

  2. 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

    程序的编写需要用到头文件,程序的编译需要lib文件,程序的运行需要dll文件,因此cmake引入第三方库其实就是将include目录.lib目录.bin目录引入工程.         目录 1.fin ...

  3. 现代CMake高级教程 - 第 3 章:链接库文件

    双笙子佯谬老师的[公开课]现代CMake高级教程课程笔记 第 3 章:链接库文件 main.cpp 调用 mylib.cpp 里的 say_hello 函数 $tree . ├── CMakeList ...

  4. CMake入门3之 静态链接库和动态链接库

    目录 目标: 环境 创建静态和动态链接库 文件准备 构建 安装静态链接库 使用静态链接库和动态库 使用动态库 使用静态库 目标: 构建静态链接库和动态链接库,安装到系统,写一个程序使用安装的静态链接库 ...

  5. cmake:add_library生成静态库和动态库

    此文为:轻松入门cmake系列教程 有时我们只需要编译出动态库,静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake 实验 实验一:生成静态库 编写代码 项目结构如下: [CMak ...

  6. CMakeLists学习二、链接库搜索路径与ld

    CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...

  7. Linux下CMake简明教程(六)动态库和静态库的编译控制

    代码在git 有时只需要编译出动态库和静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake.首先按照如下重新组织文件,只留下testFunc.h和TestFunc.c ├── CM ...

  8. libcurl linux 静态链接库_Linux学习:Makefile 模板(动态库、静态库、可执行程序)...

    1.编译动态库 ############################################################# # Makefile for shared library. ...

  9. Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别

    Gazebo作为一个运动仿真环境,可以直接加载编写好的机器人模型(如TIAGo和Yumi等),也可以自己构建多个运动模型,不过稍有难度.在构建复杂运动模型前,我们需要熟悉gazebo模型设置以及插件编 ...

最新文章

  1. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
  2. 一个Bug能有多大影响:亏损30亿、致6人死亡、甚至差点毁灭世界...
  3. 大厂提供什么样的软硬件来吸引人才?
  4. SQL 字符串分割表函数
  5. s5pv210——LCD的原理和实战
  6. Linux bash 命令
  7. 解决nginx设置反向代理后,css|js|gif|jpg|jpeg|png|bmp|swf等静态资源无法加载
  8. 自定义 Android Studio Locat 的输出颜色
  9. 最新小程序反编译详细教程,亲测可用
  10. 2020-2021年度第二届全国大学生算法设计与编程挑战赛(冬季赛)题解
  11. python实现指纹识别毕业论文_(完整版)指纹识别系统本科毕业论文
  12. 谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪?
  13. matlab生成全黑图片,程序第一次可以运行,第二次运行图片是全黑的
  14. 【JavaScript】Interview必背(详细版)
  15. 雨听 | 解除在微信公众平台中绑定的微信号
  16. 邹欣对话图灵奖得主Jeffrey Ullman:数据库不会进入周期性的坏循环 |《新程序员》
  17. 为什么有的人明明能力没问题,却总是抓不住升职加薪的机会?
  18. Javaweb化妆品网上购物系统
  19. 我,心在痛。。。。。。
  20. 从零开始的Java笔记01

热门文章

  1. springboot启动画面看腻了,换一个试试?
  2. 团队开发中,xshell共享配置文件
  3. 跑深度模型的显卡_2020年人工智能深度学习 GPU 解决方案推荐
  4. 回锅DS-4:回头看的感觉
  5. c语言输入数字输出字母代码,c语言输入数字输出字母代码求解释
  6. WEB前端-jQuery-中文文档
  7. (一)python编辑PDF文件:pdfplumber库
  8. Win10工具推荐:自带的剪切板
  9. Java讲师与Android讲师通缉令--悬赏2000元
  10. 迅雷漫画下载 v1.0(绿色版) 附源码