Когда создается ExternalProject_Add?

Я хочу создать openssl и связать с ним свой проект. В моем проекте у меня есть библиотека net, которая использует openssl. Итак, в моем net\CMakeList я добавил

include_directories(
    ../
  + ../../../ext/openssl/inc32/
)
add_library(net STATIC ${sources})
+ ADD_DEPENDENCIES(net openssl)

В моей папке ext, которая используется для организации всей внешней библиотеки, у меня есть свежий разархивированный исходный код openssl в папке с именем openssl. Затем я отредактировал ext\CmakeList

message(STATUS "Configuring OpenSSL")
set(openssl_dir openssl)
if (CMAKE_CL_64)
include(ExternalProject)

set(OPENSSL_CONFIGURE perl\ Configure\ VC-WIN64A)
set(OPENSSL_MAKE  ms\\do_win64a\ &&\ nmake\ -f\ ms\\ntdll.mak)

ExternalProject_Add(openssl
    PREFIX openssl
    #-- Download Step ----------
    SOURCE_DIR ${CMAKE_SOURCE_DIR}/ext/openssl
    #--Configure step ----------
        CONFIGURE_COMMAND ${OPENSSL_CONFIGURE}
    #--Build Step ----------
    BUILD_COMMAND ${OPENSSL_MAKE}
    BUILD_IN_SOURCE 1
    #--install Step ----------
    INSTALL_COMMAND ""} 
)

endif()

Когда я собирал, компилятор жаловался, что не может найти включаемые файлы, а исходный код openssl вообще не собирался, так как нет ни out32dll, ни inc32.

Мой вопрос: когда ExternalProject_Add фактически создает проект? Если я делаю свою сетевую библиотеку зависимой от openssl, означает ли это, что при сборке сети нужно будет сначала проверить и собрать openssl?


person Jerry    schedule 01.07.2014    source источник
comment
Это потому, что вам нужно начать, если со средами из vsvarsall.bat.   -  person    schedule 02.07.2014
comment
Извините Русло, я не совсем понимаю ваш ответ. Не могли бы вы дать мне больше информации? Спасибо.   -  person Jerry    schedule 03.07.2014
comment
@RAM: Пожалуйста, прекратите массовое редактирование тегов в вопросы. Оставьте такое массовое редактирование пользователям, которых не нужно проверять. Даже если вы редактируете теги, обязательно устраните все проблемы публикации.   -  person BDL    schedule 14.08.2018
comment
@BDL в таком случае, кто добавит теги внешнего проекта к вопросам об использовании ExternalProject_Add cmake? Никто?   -  person RAM    schedule 14.08.2018
comment
@RAM: Когда вы сталкиваетесь с такими вопросами в обычном процессе, тогда их редактирование — это нормально, но из правок, которые я видел, это выглядит больше так, как будто вы специально искали вопросы, где вы можете добавить тег. Некоторым из них несколько лет. Оставьте это пользователям с более чем 2k или подождите, пока у вас не будет 2k. Проблема с массовым редактированием (‹2k) заключается в том, что по крайней мере два других пользователя должны просмотреть ваше редактирование, что занимает много времени.   -  person BDL    schedule 14.08.2018
comment
@RAM И, пожалуйста: если вы редактируете вопрос, обязательно устраните все проблемы. В этом вопросе, например, вы также должны были удалить приветствие в конце, исправить заглавные буквы в заголовке и некоторые другие вещи (см. Мое редактирование).   -  person BDL    schedule 14.08.2018


Ответы (2)


Установить пропущенный

Прежде всего, я думаю, вы пропустили шаг установки. См. документацию:

nmake -f "ms\ntdll.mak" установить

Итак, упрощенная версия ExternalProject_Add:

ExternalProject_Add(
    OpenSSL
    URL https://github.com/openssl/openssl/archive/OpenSSL_1_0_1h.tar.gz
    CONFIGURE_COMMAND perl Configure VC-WIN64A "--prefix=${CMAKE_INSTALL_PREFIX}"
    BUILD_COMMAND "ms\\do_win64a.bat"
    COMMAND nmake -f "ms\\ntdll.mak"
    BUILD_IN_SOURCE 1
    INSTALL_COMMAND nmake -f "ms\\ntdll.mak" install
)

Найти OpenSSL

Во-вторых, если вы хотите найти библиотеки и заголовочные файлы openssl, вам нужно использовать find_package(OpenSSL):

find_package(OpenSSL REQUIRED)
message("Libs: ${OPENSSL_LIBRARIES}")
message("Includes: ${OPENSSL_INCLUDE_DIR}")

Строит

Теперь, если вы объедините все эти команды в одном проекте, шаг настройки завершится ошибкой :) Потому что это не то, как спроектирован ExternalProject. Сначала необходимо настроить суперсборку, созданную несколькими или одной командой ExternalProject_Add, а затем этап сборки установит библиотеки из внешних архивов. Это будет конфликтовать с вашим проектом, потому что библиотеки openssl не могут быть найдены - они еще не установлены суперсборкой.

Исправить

Разделить код cmake. Сначала запустите superbuild (т. е. загрузите и установите openssl):

> cmake -Hsuperbuild -B_builds\superbuild "-GVisual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=ext\install
# note, no ext\install directory yet
> cmake --build _builds\superbuild
# install done, libraries can be found in ext\install

Затем соберите свой проект, обратите внимание, что библиотеки, найденные на этапе настройки:

> cmake -Huse -B_builds\use "-GVisual Studio 12 2013 Win64" -DCMAKE_INSTALL_PREFIX=ext\install
-- Found OpenSSL: .../ext/install/lib/ssleay32.lib;.../ext/install/lib/libeay32.lib (found version "1.0.1h")
Libs: .../ext/install/lib/ssleay32.lib;.../ext/install/lib/libeay32.lib
Includes: .../ext/install/include
> cmake --build _builds\use
# OK

Экспериментальный

У меня есть экспериментальный проект, который заключает весь этот шум в одну команду (Windows протестирована на Visual Studio 2013):

hunter_add_package(OpenSSL)
find_package(OpenSSL REQUIRED)
person Community    schedule 03.07.2014

ExternalProject использовать add_custom_target внутри компании для создания проекта и в соответствии с его документом

По умолчанию от пользовательской цели ничего не зависит. Используйте ADD_DEPENDENCIES, чтобы добавить зависимости к другим целям или от них.

Поэтому, если от него не зависит ни один проект, он не будет строиться по умолчанию.

  1. Когда этот ExternalProject_Add фактически строит проект?

    Во время сборки (не во время cmake).

  2. Если я заставлю свою сетевую библиотеку зависеть от openssl, означает ли это, что при сборке сети нужно будет сначала проверить и собрать openssl?

    Нет. Поскольку вы создаете зависимость, cmake справится с ней, и openssl будет собран до вашей библиотеки.

P.S. Работы еще много. Поскольку cmake не знает, где находится результат openssl, ваш проект может столкнуться с ошибкой ссылки. Вот хороший пример из ответа "Какой наилучший способ создать ускорение с помощью cmake". Он использует add_library с IMPORTED GLOBAL и set_target_properties с IMPORTED_LOCATION_* для решения проблемы

person user3790229    schedule 02.07.2014
comment
Спасибо за ответ, @user3790229 - person Jerry; 03.07.2014
comment
Я буду беспокоиться об ошибке ссылки позже. Я думаю, что эта строка с ADD_DEPENDENCIES делает мой сетевой проект зависимым от openssl, поэтому я ожидаю, что когда я создам свои проекты, cmake автоматически проверит и создаст openssl перед моим сетевым проектом. Если я вручную соберу OpenSSL с помощью этих команд, после сборки будут созданы 2 (возможно, больше) папки: inc32 и out32dll. - person Jerry; 03.07.2014