Ошибка связывания CMake, поиск библиотеки, но «неопределенная ссылка» - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь построить проект с зависимостями как libtorch и opencv. Я использую cmake в качестве системы сборки из-за того, что она рекомендуется для обеих этих библиотек. Я в настоящее время застрял, я пытаюсь получить минимальную программу для компиляции, используя libtorch и opencv.

Моя программа выглядит так

#include <opencv2/opencv.hpp>
#include <torch/torch.h>

void showImage(cv::Mat);
at::Tensor imgToTensor(std::string img_path);

using namespace cv;
using std::cout;
using std::endl;

int main() {
    std::string img_path = "./images/01 HEAVENLY STAR080.png";
    auto tensor = imgToTensor(img_path);
    cout << tensor << endl;
}


at::Tensor imgToTensor(std::string img_path){
    Mat origImage;
    Mat normalizedImage;
    Mat sizedImage(500, 200, CV_32FC3);
    origImage = imread(img_path, 1);
    origImage.convertTo(normalizedImage, CV_32FC3);
    resize(normalizedImage, sizedImage, sizedImage.size(), 0, 0, INTER_LINEAR);
    auto input = torch::from_blob(sizedImage.data, {sizedImage.rows, sizedImage.cols, 3});
    return input;
}
void showImage(Mat image){
    namedWindow("Display window", WINDOW_AUTOSIZE);
    imshow("Display window", image);
    waitKey(0);
}

Это мой CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(ConvNet)

set(Torch_DIR /usr/local/libtorch/share/cmake/Torch)

find_package(OpenCV REQUIRED)
find_package(Torch REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(main main.cpp)
target_link_libraries(main "${OpenCV_LIBS}" "${TORCH_LIBRARIES}")

Это вывод cmake, так что я знаю, что библиотеки найдены:

-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.3.0") 
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Found Torch: /usr/local/libtorch/lib/libtorch.so  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jacob/Documents/KTH/KEX/codeEnvironment/ML_Classification_Toolkit/ML_tool/ConvNet/build

, и это ошибка, которую я получаю:

/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: in function `imgToTensor(std::string)':
main.cpp:(.text+0x8d9): undefined reference to `cv::imread(std::string const&, int)'
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: in function `showImage(cv::Mat)':
main.cpp:(.text+0xbac): undefined reference to `cv::namedWindow(std::string const&, int)'
/usr/bin/ld: main.cpp:(.text+0xc0d): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:122: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:96: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:104: all] Error 2

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Версия libtorch, которую я скачал, не поддерживала cxx11 abi и поэтому не была совместима с opencv. Исправлено изменением используемой версии libtorch.

Версия, которую я использовал, была аби до cxx11 отсюда: https://pytorch.org/get-started/locally/

Я переключился на аббревиатуру cxx11.

2 голосов
/ 27 апреля 2020

Не используйте этот устаревший материал cmake

CMake значительно упрощает процесс создания и соединения библиотек.

Вместо того, чтобы вручную указывать путь к библиотеке и Параметры компоновщика, вы можете просто создать зависимость вашей цели с библиотекой.

После короткого фрагмента о том, как он должен выглядеть:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(ConvNet)

find_package(OpenCV REQUIRED COMPONENTS opencv_highgui)
find_package(Torch REQUIRED)

add_executable(main main.cpp)

target_link_libraries(main PRIVATE opencv_highgui torch)

Наблюдения

  1. Нет включаемого каталога! Это потому, что каталог include библиотеки - это то, что сама библиотека знает!
  2. target_link_libraries, даже если он кажется таким же, здесь есть большая разница! Потому что теперь мы не говорим компилятору, что делать, а связываем цель main с целями opencv_highgui и torch.

opencv_highgui и torch равны цели как у основного. Цели создаются с использованием add_library и add_executable.

Цель имеет общедоступный c и частный интерфейс. Чтобы установить целевые свойства, мы вызываем функцию target_* (например, target_compile_features(mytarget PUBLIC cxx_std_20) говорит, что цель mytarget будет использовать функции C ++ 20, и если кто-то свяжется с нами, он автоматически использует ту же опцию компилятора`

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