Le principe de base et l'exemple détaillé de cmake find_package (two): un exemple simple de modules personnalisés Module mode-find de find_package

Un exemple simple de mode module find_package, recherchez les informations d'installation des bibliothèques dépendantes via Findxxx.cmake.

1. La structure des répertoires est la suivante:

                                      

2. Fichier de code et répertoire d'installation:

1. Le répertoire lib:

demo.h:

#include <iostream>
#include <string>

namespace test{

    std::string run();

}

demo.cpp:

#include "demo.h"

namespace test{

    std::string run()
    {
        return "find_package_demo";
    }
}

CMakeLists.txt:

cmake_minimum_required( VERSION 3.8 FATAL_ERROR)
project(demo VERSION 1.0.0 LANGUAGES CXX)
SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(PROJECT_ROOT ${CMAKE_CURRENT_LIST_DIR}/..)
set(CMAKE_INSTALL_PREFIX ${PROJECT_ROOT}/install/)#安装目录

#set compile flags
#add_definitions(-std=c++11 -g -rdynamic)
set(CMAKE_CXX_FLAGS "-g3 -rdynamic -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fsanitize=address -fno-omit-frame-pointer -fsanitize=leak")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")


SET(BIN_DESTINATION ${PROJECT_SOURCE_DIR}/bin)
SET(INSTALL_DESTION ${PROJECT_SOURCE_DIR}/install)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BIN_DESTINATION})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BIN_DESTINATION})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BIN_DESTINATION})

#include dirs
include_directories(./)

#libraries
SET(SRC demo.cpp)
add_library(demo SHARED ${SRC})
SET_TARGET_PROPERTIES(demo PROPERTIES VERSION ${PROJECT_VERSION}) 
SET_TARGET_PROPERTIES(demo PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_LIST_DIR}/demo.h)

install(TARGETS demo
    EXPORT  demo
    LIBRARY DESTINATION lib  # 动态库安装路径
    ARCHIVE DESTINATION lib  # 静态库安装路径
    RUNTIME DESTINATION bin  # 可执行文件安装路径
    PUBLIC_HEADER DESTINATION include  # 头文件安装路径
    )

2. Répertoire principal

main.cpp:

#include <iostream>
#include <string>

#include "demo.h"

using namespace std;

int main(int argc,char *argv[])
{
    cout<<"main..."<<endl;
    cout<<test::run()<<endl;
    cout<<"exit."<<endl;
    return 0;
}

CMakeLists.txt:

cmake_minimum_required( VERSION 3.8 FATAL_ERROR)
project(main VERSION 1.0.0 LANGUAGES CXX)
SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(PROJECT_ROOT ${CMAKE_CURRENT_LIST_DIR}/..)
message(${PROJECT_ROOT})
set(CMAKE_INSTALL_PREFIX ${PROJECT_ROOT}/install/)

#set compile flags
#add_definitions(-std=c++11 -g -rdynamic)
set(CMAKE_CXX_FLAGS "-g3 -rdynamic -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fsanitize=address -fno-omit-frame-pointer -fsanitize=leak")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")

#set dirs
SET(BIN_DESTINATION ${PROJECT_SOURCE_DIR}/bin)
SET(INSTALL_DESTION ${PROJECT_SOURCE_DIR}/install)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BIN_DESTINATION})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BIN_DESTINATION})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BIN_DESTINATION})


#设置查找Finddemo.cmake的路径
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/cmake/)
message("cmake_module_path:${CMAKE_MODULE_PATH}")

#使用find_package查找demo(这里会从CMAKE_MODULE_PATH设置的路径中查找)
find_package(demo REQUIRED MODULE)

#如果找到了(demo_FOUND会被设置为True,是一种约定,你也可以使用自己喜欢的变量<但是不建议这么做>)
if (demo_FOUND)
    #打印相关的信息
    message("demo_FOUND:${demo_FOUND}")
    message("demo_version:${demo_VERSION}")
    message("demo_include:${demo_INCLUDE_DIR}")
    message("demo_library:${demo_LIBRARY}")
endif()

#include dirs
include_directories(./ ${demo_INCLUDE_DIR}) #把demo.h所在的路径demo_INCLUDE_DIR添加到include dir中(Finddemo.cmake已经设置了demo_INCLUDE_DIR变量)
#link dirs
link_directories(${BIN_DESTINATION})

#execute 
SET(SRC_MAIN main.cpp)
add_executable( ${PROJECT_NAME} ${SRC_MAIN})
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION}) 
target_link_libraries(${PROJECT_NAME} ${demo_LIBRARY}) #链接libdemo.so(Finddemo.cmake设置了demo_LIBRARY变量)

install(TARGETS main
    EXPORT  main
    LIBRARY DESTINATION lib  # 动态库安装路径
    ARCHIVE DESTINATION lib  # 静态库安装路径
    RUNTIME DESTINATION bin  # 可执行文件安装路径
    PUBLIC_HEADER DESTINATION include  # 头文件安装路径
    )

répertoire cmake:

Fichier Finddemo.cmake

message("now using Finddemo.cmake find demo lib")

#find demo.h
FIND_PATH(demo_INCLUDE_DIR demo.h 
    /usr/include/demo/ 
    /usr/local/demo/include/ 
    ~/work/demo/find_package_simple/install/include/)

message("include_dir: ${demo_INCLUDE_DIR}")

#find libdemo.so
FIND_LIBRARY(demo_LIBRARY libdemo.so 
    /usr/local/demo/lib/ 
    ~/work/demo/find_package_simple/install/lib/)

message("libs: ${demo_LIBRARY}")

if(demo_INCLUDE_DIR AND demo_LIBRARY)
    set(demo_FOUND TRUE)
    set(demo_VERSION 1.0.0)
endif(demo_INCLUDE_DIR AND demo_LIBRARY)

3. Répertoire d'installation

répertoire bin:

répertoire lib:

inclure le répertoire:

Troisièmement, description du principe de find_package:

Lors de la construction de main, cmake recherchera le fichier Finddemo.cmake dans le répertoire spécifié à la ligne 24 de CMakeLists.txt dans le répertoire principal, et find_package (démo) à la ligne 28 trouvera les informations d'installation (fichier d'en-tête, .cmake) de la démo via le fichier Finddemo.cmake. so ou .a, informations de version, etc.), le fichier Finddemo.cmake définit les variables liées aux informations d'installation de la démo (demo_FOUND, demo_INCLUDE_DIR, demo_LIBRARY, demo_VERSION, etc.), et demo_FOUND indique si la recherche est réussie. Ces variables sont utilisées dans le fichier CMakeLists.txt

Quatrièmement, le code:

          Voir https://download.csdn.net/download/lianshaohua/12830796 pour plus de détails

Je suppose que tu aimes

Origine blog.csdn.net/lianshaohua/article/details/108487599
conseillé
Classement