update
This commit is contained in:
parent
fff4e996d2
commit
5bf5a20624
@ -383,7 +383,7 @@ cpack
|
||||
|
||||
== Примеры библиотек и приложений
|
||||
|
||||
|
||||
[[base-lib-project]]
|
||||
=== Базовая библиотека
|
||||
|
||||
Проект с базовой библиотекой реализован на основе <<base-project,базового проекта>>.
|
||||
@ -494,6 +494,8 @@ int32_t cmlib_example_init(int32_t i = 0)
|
||||
}
|
||||
----
|
||||
|
||||
|
||||
[[base-app-project]]
|
||||
=== Базовое приложение
|
||||
|
||||
Проект с базовым приложением реализован на основе <<base-project,базового проекта>>.
|
||||
@ -594,132 +596,93 @@ int main(int argc, char* argv[])
|
||||
----
|
||||
|
||||
|
||||
ПИШУ ЗДЕСЬ!!!
|
||||
=== Подключение внешнего проекта
|
||||
|
||||
Проект, использующий для сборки внешний проект, реализован на основе проектов
|
||||
<<base-lib-project,базовой библиотеки>> и <<base-app-project,базового приложения>>.
|
||||
Исходные тексты содержат комментарии, объясняющие назначение используемых функций.
|
||||
Проект можно посмотреть https://git.246060.ru/f1x1t/cmlib-example-app-ext[здесь]
|
||||
или сделать его копию командой:
|
||||
|
||||
== Подключение внешнего проекта
|
||||
|
||||
В каталоге `cmex/thirdparty` нужно создать каталог `cmext` с проектом,
|
||||
состоящим из файла `cmext.hpp`:
|
||||
|
||||
[source,c]
|
||||
[source,sh]
|
||||
----
|
||||
#ifndef CMEXT_CMEXT_HPP_
|
||||
#define CMEXT_CMEXT_HPP_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int32_t cmext_init(int32_t i);
|
||||
|
||||
#endif
|
||||
git clone --recursive https://git.246060.ru/f1x1t/cmlib-example-app-ext
|
||||
----
|
||||
|
||||
файла `cmext.cpp`:
|
||||
Для подключения проекта базовой библиотеки нужно выполнить:
|
||||
|
||||
[source,c]
|
||||
[source,sh]
|
||||
----
|
||||
#include "cmext.hpp"
|
||||
|
||||
int32_t cmext_init(int32_t i = 0) {
|
||||
return i;
|
||||
}
|
||||
----
|
||||
|
||||
и файла `CMakeLists.txt`:
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
cmake_minimum_required(VERSION 3.3)
|
||||
project(cmext)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
add_library(cmext cmext.cpp)
|
||||
install(TARGETS cmext ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
install(FILES cmext.hpp COMPONENT headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME})
|
||||
----
|
||||
|
||||
В файле `cmex/CMakeLists.txt` нужно подключить стандартный модуль
|
||||
`ExternalProject` и описать правила для его загрузки, настройки,
|
||||
компиляции и установки для сопряжения с текущим проектом:
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
# Подключение внешних проектов
|
||||
include(ExternalProject)
|
||||
|
||||
ExternalProject_Add(cmext
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/cmext
|
||||
INSTALL_DIR ${CMAKE_BINARY_DIR}
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libcmext.a
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=Release
|
||||
)
|
||||
git submodule add https://git.246060.ru/f1x1t/cmlib-example-library thirdparty/cmlib-example-library
|
||||
git submodule update --init --recursive
|
||||
----
|
||||
|
||||
Вызовы этих функций нужно сделать до функций `add_subdirectories`, чтобы
|
||||
в подключенных подкаталогах можно было использовать цель `cmext` для
|
||||
определения зависимостей.
|
||||
|
||||
В файле `cmex/src/cmex/CMakeLists.txt` нужно подключить внешний проект
|
||||
`cmext`:
|
||||
В файл `CMakeLists.txt`, находящийся в корневом каталоге проекта, перед функциями
|
||||
`add_subdirectories` нужно добавить:
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
# Подключение внешних проектов
|
||||
include(ExternalProject)
|
||||
|
||||
ExternalProject_Add(ext-lib
|
||||
EXCLUDE_FROM_ALL TRUE
|
||||
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/cmlib-example-library
|
||||
INSTALL_DIR ${CMAKE_BINARY_DIR}
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libcmlib-example.a
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=Release
|
||||
)
|
||||
----
|
||||
|
||||
В результате будет создана цель `ext-lib`, являющаяся результатом сборки
|
||||
подключённой библиотеки. Все функции `ExternalProject_Add` необходимо располагать
|
||||
перед функциям `add_subdirectories`, чтобы в указанных подкаталогах можно было
|
||||
использовать добавленные цели для определения зависимостей.
|
||||
|
||||
В файле `src/cmlib-example/CMakeLists.txt` нужно подключить внешний проект `ext-lib`:
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
# Зависимость от библиотеки из внешнего проекта проекта
|
||||
add_dependencies(${current_target} cmext)
|
||||
add_dependencies(${TRGT} ext-lib)
|
||||
|
||||
# Добавление каталога, в который устанавливаются заголовочные файлы
|
||||
# от внешнего проекта, к списку путей для поиска
|
||||
target_include_directories(${TRGT} PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>)
|
||||
|
||||
# Компоновка с библиотекой из внешнего проекта
|
||||
target_link_libraries(${TRGT} ${CMAKE_BINARY_DIR}/lib/libcmlib-example.a)
|
||||
----
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
# Добавление каталога, в который устанавливаются заголовочные файлы от внешнего
|
||||
# проекта cmext, к списку путей для поиска заголовочных файлов
|
||||
target_include_directories(${current_target} PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include/cmext>)
|
||||
----
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
# Библиотека из внешнего проекта cmext
|
||||
target_link_libraries(${current_target} ${CMAKE_BINARY_DIR}/lib/libcmext.a)
|
||||
----
|
||||
|
||||
Для проверки работоспособности в файле `cmex/src/cmex/main.cpp` нужно
|
||||
вызвать функцию `cmext_init` из библиотеки, предоставляемой внешним
|
||||
Для проверки работоспособности в файле `src/cmlib-example/main.cpp` нужно
|
||||
вызвать функцию `cmlib_example_init` из библиотеки, предоставляемой внешним
|
||||
проектом. Например, можно заменить его содержимое на:
|
||||
|
||||
[source,cpp]
|
||||
----
|
||||
#include "compiler_features.hpp"
|
||||
#include "cmlib_config.hpp"
|
||||
#include <cmlib-example/init.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <cmext/cmext.hpp>
|
||||
|
||||
#include "cmex.hpp"
|
||||
|
||||
QTextStream& qStdOut()
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
static QTextStream ts(stdout);
|
||||
return ts;
|
||||
}
|
||||
auto s = cmlib_example_init( argc );
|
||||
std::cout << s << std::endl;
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// Значение из compiler_features.hpp
|
||||
qStdOut() << QObject::tr("Compiler version: ") << CMEX_COMPILER_VERSION_MAJOR << endl;
|
||||
// Значение из cmlib_config.hpp
|
||||
qStdOut() << QObject::tr("Project version: ") << CMEX_VERSION_STR << endl;
|
||||
// Значение из cmlib_config.hpp
|
||||
qStdOut() << QObject::tr("Build type: ") << BUILD_TYPE << endl;
|
||||
// Функция из внутренней библиотеки
|
||||
qStdOut() << QObject::tr("libcmex function call: ") << cmex_init(4) << endl;
|
||||
// Функция из внешней библиотеки
|
||||
qStdOut() << QObject::tr("libcmext function call: ") << cmext_init(9) << endl;
|
||||
|
||||
return 0;
|
||||
return ( s );
|
||||
}
|
||||
----
|
||||
|
||||
|
||||
ПИШУ ЗДЕСЬ!!!
|
||||
|
||||
|
||||
== Qt5
|
||||
|
||||
Для поиска необходимых компонентов Qt5 нужно в файл `cmex/CMakeLists.txt`
|
||||
@ -742,11 +705,11 @@ find_package(Qt5 COMPONENTS Core Network Gui Widgets DBus Concurrent Sql REQUIRE
|
||||
[source,cmake]
|
||||
----
|
||||
# Qt5
|
||||
qt_translation(TARGET ${current_target} TS_DIR ${CMAKE_SOURCE_DIR}/l10n LANGUAGES ru_RU)
|
||||
target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||
target_compile_options(${current_target} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
|
||||
qt_translation(TARGET ${TRGT} TS_DIR ${CMAKE_SOURCE_DIR}/l10n LANGUAGES ru_RU)
|
||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||
target_compile_options(${TRGT} PUBLIC "${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
|
||||
|
||||
target_link_libraries(${current_target} Qt5::Core)
|
||||
target_link_libraries(${TRGT} Qt5::Core)
|
||||
----
|
||||
|
||||
Для проверки работоспособности подключения Qt5 файл
|
||||
@ -925,12 +888,12 @@ int main(int argc, char **argv) {
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
set(current_target_sources
|
||||
set(TRGT_sources
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/my_main_window.cpp
|
||||
)
|
||||
|
||||
set(current_target_uis
|
||||
set(TRGT_uis
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/my_main_window.ui
|
||||
)
|
||||
----
|
||||
@ -938,7 +901,7 @@ set(current_target_uis
|
||||
[source,cmake]
|
||||
----
|
||||
# Цель для создания исполняемого файла
|
||||
add_executable(${current_target} ${current_target_sources} ${current_target_uis})
|
||||
add_executable(${TRGT} ${TRGT_sources} ${TRGT_uis})
|
||||
----
|
||||
|
||||
и добавить строки для подключения графических библиотек Qt5 и
|
||||
@ -946,10 +909,10 @@ add_executable(${current_target} ${current_target_sources} ${current_target_uis}
|
||||
|
||||
[source,cmake]
|
||||
----
|
||||
target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Gui_INCLUDE_DIRS})
|
||||
target_include_directories(${current_target} SYSTEM PUBLIC ${Qt5Widgets_INCLUDE_DIRS})
|
||||
target_link_libraries(${current_target} Qt5::Gui)
|
||||
target_link_libraries(${current_target} Qt5::Widgets)
|
||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Gui_INCLUDE_DIRS})
|
||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Widgets_INCLUDE_DIRS})
|
||||
target_link_libraries(${TRGT} Qt5::Gui)
|
||||
target_link_libraries(${TRGT} Qt5::Widgets)
|
||||
----
|
||||
|
||||
Во время сборки проекта в файл переводов `cmex/l10n/cmex_app_ru_RU.ts`
|
||||
|
Loading…
x
Reference in New Issue
Block a user