#c #c #opencv #cmake #wiringpi
#c #c #opencv #cmake #wiringpi
Вопрос:
Я работаю над проектом с использованием OpenCV и cmake (с обоими из которых я новичок) и продолжаю получать неопределенные ссылки на функции, которые расположены во внешних папках.
Это для Raspberry Pi, использующего интерфейс командной строки. Мой CMakeLists.txt файл выглядит следующим образом:
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
project(projectName)
find_package(OpenCV REQUIRED)
add_executable(${PROJECT_NAME} project.cpp supportFile.c supportFile2.c)
target_link_libraries(projectName ${OpenCV_LIBS} wiringPi)
Когда я компилирую с cmake .
помощью and make
, он завершается, но со следующим сообщением:
CMakeFiles/.dir/projectName.cpp.o: In function `main':
projectName.cpp:(.text 0x4c): undefined reference to `initializeBoard()'
projectName.cpp:(.text 0x98): undefined reference to `setRS485ServoPosition(unsigned short, unsigned short, unsigned short)'
Все неопределенные ссылки являются вызовами функций в supportFile.c, supportFile2.c или библиотеке WiringPi. Я не уверен, как исправить эту проблему?
project.cpp файл:
#include "opencv2/highgui.hpp"
#include "opencv2/opencv.hpp"
#include "supportFile.h"
#include "supportFile2.h"
int main(int argc, char* argv[]) {
initializeBoard(); brake = 0; speed = 70; usmAngle = 5; value = 4;
setRS485ServoPosition(USM,0,usmAngle);
setRS485ServoPosition(CAMERASERVO,0,value);
...
initializeBoard() находится в файле поддержки.файл h и функции setRS485ServoPosition() находятся в supportFile2.h .
Комментарии:
1. Являются ли неопределенные символы как из вашего кода?
2. Они должны быть реализованы в файлах или библиотеках cpp, а не в заголовках.
3. ДА. Мой project.cpp код выглядит следующим образом: (не удалось получить код для отображения в кодовых блоках?) #включить «opencv2 / highgui.hpp» #включить «opencv2 / opencv.hpp» #включить «piBoard.h» #включить «RS485Devices.h» int main(int argc, char* argv[]) { initializeBoard(); тормоз = 0; скорость = 70; usmAngle = 5; значение = 4; setRS485ServoPosition(USM,0,usmAngle); setRS485ServoPosition(CAMERASERVO,0,значение); … Функция initializeBoard() находится в файле piBoard.h, а функции setRS485…() находятся в файле RS485Devices.h. piBoard.h включает библиотеку WiringPi.
4. извините, projectName.cpp = project.cpp
5. piBoard.h и RS485Devices. у меня есть поддерживающие файлы .c, которые я скомпилировал в cmake с помощью: add_executable(ProjectName project.cpp piBoard.c RS485 устройства.c). Поможет ли выполнение каждого из них в отдельных исполняемых файлах и target_link_libraries?
Ответ №1:
Я понял, в чем была моя проблема. Это было не с cmake, а с supportFile.h и supportFile2.h. Я внес следующие изменения в оба файла:
// .h file #include and #define section
#ifdef __cplusplus
extern "C" {
#endif
extern // to all .h functions section
#ifdef __cplusplus
}
#endif
После этого все скомпилировалось и запустилось.
Комментарии:
1.
extern
ничего не делает при применении к объявлениям функций. Этогоextern "C"
должно быть достаточно.2. Спасибо. Я не знаком с файлами .h, поскольку я впервые работаю с ними. Я только что заметил, что в файле wiringPiSerial.h он был написан с помощью extern для всех функций.