Um exemplo simples do modo do módulo find_package, encontre as informações de instalação das bibliotecas dependentes em Findxxx.cmake.
1. A estrutura do diretório é a seguinte:
2. Arquivo de código e diretório de instalação:
1. O diretório 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. Diretório 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 # 头文件安装路径
)
diretório cmake:
Arquivo 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. Instalar diretório
diretório bin:
diretório lib:
incluir diretório:
Três, descrição do princípio find_package:
Ao compilar o main, o cmake irá procurar o arquivo Finddemo.cmake no diretório especificado na linha 24 de CMakeLists.txt no diretório principal, e find_package (demo) na linha 28 encontrará as informações de instalação (arquivo de cabeçalho, .cmake) do demo através do arquivo Finddemo.cmake. ou .a, informações de versão, etc.), o arquivo Finddemo.cmake define as variáveis relacionadas às informações de instalação do demo (demo_FOUND, demo_INCLUDE_DIR, demo_LIBRARY, demo_VERSION, etc.), e o demo_FOUND indica se a pesquisa foi bem-sucedida. Essas variáveis são usadas no arquivo CMakeLists.txt
Quarto, o código:
Consulte https://download.csdn.net/download/lianshaohua/12830796 para obter detalhes