Step 2: Adding a Library

参考
参考

1完整代码

|-step2
|--CMakeLists.txt
|--tutorial.cxx
|--MathFunctions
|--CMakeLists.txt
|--mysqrt.h
|--mysqrt.cxx

|--CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(Tutorial)

设置宏变量

option(USE_MYMATH "Use tutorial provided math implementation" OFF)

根据宏变量的配置,决定是否生成库文件

if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif()

在执行cmake ../build时,会显示message信息

if(USE_MYMATH)
message("option USE_MYMATH is ${USE_MYMATH}")
else()
message("option USE_MYMATH not define")
endif()

生成可执行文件Tutorial

add_executable(Tutorial tutorial.cxx)

将库文件链接到Tutorial

target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})

添加目录文件所需要的头文件

target_include_directories(Tutorial PUBLIC
${PROJECT_BINARY_DIR}
${EXTRA_INCLUDES}
)

|--MathFunctions
|--CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

递归获取目录下所有的.cxx文件

file(GLOB_RECURSE cpp_files ./*.cxx)

递归获取目录下所有的h文件

file(GLOB_RECURSE h_files ./*.h)

project(MathFunctions)

生成默认的静态库MathFunctions,win为MathFunctions.lib, linux为libMathFunctions.a

add_library(MathFunctions mysqrt.cxx)

2命令学习

  • add_library

生成库文件,可以生成静态、动态等库文件,一般放在某一个子文件中。然后在主CMakeLists.text中,通过使用add_subdirectory来生成。

例如:
## MathFunctions/CMakeLists.txt

add_library(MathFunctions mysqrt.cxx)

就是生成静态库MathFunctions,即libMathFunctions.a

CMakeLists.txt

add the MathFunctions library,执行子文件夹MathFunctions下的CMakeLists.txt

add_subdirectory(MathFunctions)

add the executable,生成Tutorial可执行文件,源代码为tutorial.cxx

add_executable(Tutorial tutorial.cxx)

target_link_libraries(Tutorial PUBLIC MathFunctions)

add the binary tree to the search path for include files

so that we will find TutorialConfig.h

target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
"${PROJECT_SOURCE_DIR}/MathFunctions"
)

参考

  • target_link_libraries: 设置要链接的库文件的名称,指出被依赖的库放在依赖它的库的后面

    • 语法

      target_link_libraries(
      <PRIVATE|PUBLIC|INTERFACE> ...
      [<PRIVATE|PUBLIC|INTERFACE> ...]...)

将被依赖的库放在依赖它的库的后面,上面中表示Tutorial依赖libMathFunctions.so

举例:

target_link_libraries(myProjectExecutable A B.a C.so)

在上面的命令中,libA.so可能依赖于libB.a和libC.so,如果顺序有错,链接时会报错。还有一点,B.a会告诉CMake优先使用静态链接库libB.a,C.so会告诉CMake优先使用动态链接库libC.so,也可直接使用库文件的相对路径或绝对路径。使用绝对路径的好处在 于,当依赖的库被更新时,make的时候也会重新链接。

参考

注意区分target_link_librarieslink_libraries的区别,请参考

  • link_libraries:添加需要链接的库文件路径,注意这里是全路径

    • 例如
      • 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")
  • link_directories:指定第三方库所在文件夹全路径

例如

set(LINK_DIR /Users/haoran/Downloads/wfdb/lib)
link_directories({LINK_DIR})

这样在使用target_link_libraries时,只需要给出动态库的名字就行,如:

target_link_libraries(myProjectExecutable eng mx)

  • include_directories: 指定头文件所在文件夹全路径

完整的例子

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)

  • target_include_directories

注意区分target_include_directoriesinclude_directories

  • option:添加开关宏

    option(USE_MYMATH "Use tutorial provided math implementation" ON)

    if(USE_MYMATH)
    add_subdirectory(MathFunctions)
    list(APPEND EXTRA_LIBS MathFunctions)
    list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
    endif()

  • file: 可以递归搜索文件

    递归获取目录下所有的.cxx文件

    file(GLOB_RECURSE cpp_files ./*.cxx)

    递归获取目录下所有的h文件

    file(GLOB_RECURSE h_files ./*.h)

posted @ 2022-02-10 12:22  绍荣  阅读(142)  评论(0)    收藏  举报