The basic principle and detailed example of cmake find_package (two): a simple example of find_package's Module mode-find custom modules

A simple example of find_package Module mode, find the installation information of dependent libraries through Findxxx.cmake.

1. The directory structure is as follows:

                                      

2. Code file & installation directory:

1. The lib directory:

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. Main directory

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  # 头文件安装路径
    )

cmake directory:

Finddemo.cmake file

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. Install directory

bin directory:

lib directory:

include directory:

Three, find_package principle description:

When building main, cmake will look for the Finddemo.cmake file in the directory specified on line 24 of CMakeLists.txt in the main directory, and find_package(demo) on line 28 will find the installation information (header file, .cmake) of the demo through the Finddemo.cmake file. so or .a, version information, etc.), the Finddemo.cmake file sets the variables related to the installation information of the demo (demo_FOUND, demo_INCLUDE_DIR, demo_LIBRARY, demo_VERSION, etc.), and the demo_FOUND indicates whether the search is successful. These variables are used in the CMakeLists.txt file

Fourth, the code:

          See https://download.csdn.net/download/lianshaohua/12830796 for details

Guess you like

Origin blog.csdn.net/lianshaohua/article/details/108487599