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