cmake 引用第三方库的三种方式
CMake工程引用第三方库的三种方式
方式一:“库名”直接引用方式
#include_directories("D:/boost_1_79_0") # 头文件的路径
#link_directories(${INC_DIR}/stage/lib) # .a 文件的路径
find_package(Qt5 COMPONENTS Widgets REQUIRED)
#方式一: 库名引用方式
set(INC_DIR "D:/boost_1_79_0")
set(LIB_DIR ${INC_DIR}/stage/lib)
add_executable(tesqm
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
image.qrc
mycustomwdg.h
mycustomwdg.cpp
)
target_include_directories(tesqm PRIVATE ${INC_DIR})
target_link_libraries(tesqm PRIVATE Qt5::Widgets ${LIB_DIR}/libboost_filesystem-vc141-mt-gd-x32-1_79.lib)
方式二:find_library 寻库方式
find_library () 则主要用于查找单个库文件。如果你只需要使用某个库文件而不需要配置整个第三方软件包,那么可以使用 find_library ()来查找该库文件并设置库路径、链接选项等。
find_package(Qt5 COMPONENTS Widgets REQUIRED) #方式一:find_library set(INC_DIR "D:/boost_1_79_0") find_library(LIB_DIR libboost_filesystem-vc141-mt-gd-x32-1_79 ${INC_DIR}/stage/lib) add_executable(tesqm main.cpp mainwindow.cpp mainwindow.h mainwindow.ui image.qrc mycustomwdg.h mycustomwdg.cpp ) target_include_directories(tesgm PRIVATE ${INC_DIR}) target_link_libraries(tesqm PRIVATE Qt5::Widgets ${LIB_DIR})
方式三:find_package 寻包方式
find_package() 主要用于查找并配置复杂的第三方软件包,这些软件包通常包含多个库和头文件,并且可能需要执行额外的配置步骤。
例如,对于 Boost 库,你需要使用 find_package () 来查找和配置 Boost,CMake 会查找 Boost 库的位置,并设置正确的库路径、头文件路径和编译选项等。
https://blog.csdn.net/weixin_44084452/article/details/141273813
find_package和find_library 比较
在CMake中,find_package 和 find_library 都是用来找到和链接库的方法,但它们的用法和适用场景略有不同。
find_package 主要用于寻找具有CMake配置文件的库,这些库通常遵循CMake的规范,提供了用于导入目标、库路径、头文件路径等的配置文件。
这使得使用find_package更加简洁,只需指定需要的组件即可自动处理头文件路径、库路径等。
find_package更适合于较大、更复杂的库,如Boost。
在找到库后,find_package会生成相关的导入目标(如Boost::filesystem)供你在target_link_libraries中使用。
find_library则是一个更基础的方法,用于在系统中搜索特定的库文件。它不依赖于库提供的CMake配置文件,而是直接查找库文件。
使用find_library时,需要手动指定库文件路径、头文件路径等。
find_library更适合于较小或没有CMake配置文件的库,如Crypto++。比如实际应用中,我们使用find_library来找到Crypto++库,因为Crypto++库没有提供CMake配置文件。
而对于Boost,我们使用find_package,因为Boost库提供了CMake配置文件,使得库的查找和链接更简便。
总之,find_package和find_library都可以用于在CMake中查找和链接库,但find_package更适用于具有CMake配置文件的库,而find_library则适用于没有CMake配置文件的库。
浙公网安备 33010602011771号