Неопределенная ссылка при компиляции с cmake

#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 для всех функций.