Ошибки компоновщика / загрузчика "неопределенная ссылка на ..." при связывании с библиотекой raspicam - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь скомпилировать простой проект с cmake , используя библиотеку raspicam.Проект составлен без нареканий;тем не менее, у меня есть ld ошибки в конце.Распикам скачал отсюда: http://www.uco.es/investiga/grupos/ava/node/40. Есть идеи?

main.cpp:

#include <raspicam_cv.h>

int main ( int argc,char **argv ) {
    raspicam::RaspiCam_Cv capture;

    if (!capture.open()) {
        return 1;
    }
    return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(raspicam)

set(CMAKE_CXX_STANDARD 17)
include_directories(raspicam-0.1.6/src)
link_directories(raspicam-0.1.6/src)
add_executable(raspicam main.cpp)
set(RASPICAM_LIB ${CMAKE_SHARED_LIBRARY_PREFIX}raspicam_cv${CMAKE_SHARED_LIBRARY_SUFFIX})
target_link_libraries(raspicam ${RASPICAM_LIB})

Команда построения:

cd raspicam-0.1.6/ && cmake -DOpenCV_DIR=/home/user/Projects/opencv/opencv-build . && make && cd .. && cmake . && make

Ошибки:

CMakeFiles/raspicam.dir/main.cpp.o: In function `main':
/home/user/CLionProjects/raspicam/main.cpp:5: undefined reference to `raspicam::RaspiCam_Cv::RaspiCam_Cv()'
/home/user/CLionProjects/raspicam/main.cpp:7: undefined reference to `raspicam::RaspiCam_Cv::open()'
/home/user/CLionProjects/raspicam/main.cpp:5: undefined reference to `raspicam::RaspiCam_Cv::~RaspiCam_Cv()'
/home/user/CLionProjects/raspicam/main.cpp:5: undefined reference to `raspicam::RaspiCam_Cv::~RaspiCam_Cv()'
collect2: error: ld returned 1 exit status
CMakeFiles/raspicam.dir/build.make:94: recipe for target 'raspicam' failed
make[2]: *** [raspicam] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/raspicam.dir/all' failed
make[1]: *** [CMakeFiles/raspicam.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

1 Ответ

0 голосов
/ 06 февраля 2019

Похоже, вы пытаетесь построить raspicam из источника.Глядя на документацию , которую вы связали , выясняется, что raspicam предоставляет пакет поиска CMake и рекомендует пользователям включать библиотеку следующим образом:

project (my_raspi_project)
find_package(raspicam REQUIRED)
add_executable (my_raspi_project main.cpp)  
target_link_libraries (my_raspi_project ${raspicam_LIBS})

Я бы посоветовал вам сделать это, но этопотребует установки raspicam в вашей системе.То есть сначала вам нужно будет выполнить шаги установки, перечисленные в приведенной выше документации:

tar xvzf raspicamxx.tgz
cd raspicamxx
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig

Это установит пакет в место, где CMake сможет его найти, и разрешит find_package(raspicam REQUIRED), используемый в вашем CMakeList.TXT для правильной работы.

Если у вас нет возможности установить библиотеку на свой компьютер для разработки, и вместо этого вы хотите собрать ее из исходного кода вместе с вашим проектом, вы можете рассмотреть следующие вопросы:

  1. ИспользованиеCMake add_subdirectory команда

  2. Использование команды CMake ExternalProject_Add .

Опция №1 позволит вамчтобы обновить файл CMakeList.txt, чтобы он выглядел следующим образом:

cmake_minimum_required(VERSION 3.10)
project(raspicam)

set(CMAKE_CXX_STANDARD 17)
add_subdirectory(<path to raspicam CMakeList.txt>)
add_executable(my_raspicam_program main.cpp)
target_link_libraries(my_raspicam_program raspicam)

Обратите внимание, что вам нужно будет изменить целевое имя raspicam на что-то уникальное, так как это целевое имя используется пакетом, которым вы являетесьв том числе с add_subdirectory.

Вариант №2 более сложен, но дает дополнительное преимущество, заключающееся в том, что вы не будете отслеживать исходный код raspicam в вашей системе контроля версий.

...