Я использую 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)

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

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

1
Arbok 18 Фев 2020 в 12:54

2 ответа

Лучший ответ

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

Для этого есть несколько предпосылок:

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

  2. Вы должны указать CMake искать статические библиотеки ТОЛЬКО . Это делается с помощью переменной CMAKE_FIND_LIBRARY_SUFFIXES. Скорее всего, по умолчанию это .so;.a, что означает, что он сначала найдет общую библиотеку.

set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

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

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

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

0
Pesho_T 18 Фев 2020 в 14:12

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

0
diffuse 18 Фев 2020 в 09:58