Использование CMake для создания исполняемого файла, который может работать независимо на других машинах - PullRequest
1 голос
/ 18 февраля 2020

Я использую LibTorch и OpenCV для программы на Cpp. Компиляция и сборка выполняются на Linux с использованием CMake. Программа собирается и запускается, как и ожидалось.

Я хочу использовать исполняемый файл, созданный CMake на другом компьютере Linux. Проблема в том, что я не хочу устанавливать ни LibTorch, ни OpenCV на другую машину. Я бы предпочел предоставить пользователю один исполняемый файл, если это возможно.

Как CMake может создать один независимый исполняемый файл? Если создание только одного файла не имеет значения, как CMake может скопировать все необходимые библиотеки в один каталог?

Текущий файл CMake:

    cmake_minimum_required(VERSION 2.8)
    project(prediction)
    list(APPEND CMAKE_PREFIX_PATH “libtorch”) # the folder where libtorch in found
    set(CMAKE_BUILD_TYPE Release)

    find_package( OpenCV REQUIRED )
    find_package( Torch REQUIRED )

    if(NOT Torch_FOUND)
    message(FATAL_ERROR “Pytorch Not Found!”)
    endif(NOT Torch_FOUND)

    message(STATUS “Pytorch status:”)
    message(STATUS " libraries: ${TORCH_LIBRARIES}")

    message(STATUS “OpenCV library status:”)
    message(STATUS " version: ${OpenCV_VERSION}")
    message(STATUS " libraries: ${OpenCV_LIBS}")
    message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")

    file(GLOB SOURCES ".h" ".cpp") # Link all headers and sources in root dir

    include_directories( ${OpenCV_INCLUDE_DIRS} )
    add_executable(entrypoint ${SOURCES})
    target_link_libraries(entrypoint ${TORCH_LIBRARIES} ${OpenCV_LIBS})
    set_property(TARGET entrypoint PROPERTY CXX_STANDARD 14)
####### EDIT

Спасибо за ответы. Следуя приведенному ниже ответу Phesho_T, я получил сборку stati c LibTorch, но он не скомпилируется с инструкцией set (). Выдает C10_LIBRARY NOTFOUND.

Я думаю, что я попытаюсь использовать общие библиотеки. Как CMake можно поручить скопировать соответствующие общие библиотеки в папку «build», чтобы я мог упаковать все в файл .zip и отправить его пользователю.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Как и в другом ответе, вам нужно связать статические c библиотеки Torch и OpenCV в вашем исполняемом файле.

Для этого есть несколько предварительных условий:

  1. Для двух библиотек необходимо, чтобы в вашей системе были установлены библиотеки stati c (.a). Если они этого не делают, вам, возможно, придется создавать их вручную. Шаги для этого различаются в разных пакетах.

  2. Вы должны указать CMake для поиска stati c library ONLY . Это делается с помощью переменной CMAKE_FIND_LIBRARY_SUFFIXES . Возможны значения по умолчанию для этого .so;.a, что означает, что он сначала найдет общую библиотеку.

set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

Тот факт, что вы используете переменные в вашей команде target_link_libraries вместо импортированных библиотек (современный способ CMake) заставляет меня думать, что этого должно быть достаточно - эти переменные должны расширяться до полных путей к библиотекам stati c, которые затем должны быть добавлены в команду компоновщика .

Немного сложнее объяснить, если использовались импортированные цели, но это может быть за рамками этого вопроса.

Попробуйте и дайте нам знать, как вы получите на.

0 голосов
/ 18 февраля 2020

Чтобы создать отдельный исполняемый файл, вам необходимо статически связать зависимости в ваш исполняемый файл. Проверьте свои библиотеки, чтобы увидеть, предоставляют ли они stati c -libs, иначе вам нужно перекомпилировать libtorch или opencv для создания библиотек stati c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...