【问题标题】:Undefined Reference when compiling with cmake使用 cmake 编译时未定义的引用
【发布时间】:2019-09-05 23:08:52
【问题描述】:

我正在使用 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 .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() 位于 supportFile.h 文件中,setRS485ServoPosition() 函数位于 supportFile2.h 中。

【问题讨论】:

  • 未定义的符号是否都来自您的代码?
  • 这些应该在 cpp 文件或库而不是头文件中实现。
  • 是的。我的 project.cpp 代码如下所示:(无法在代码块中显示代码?)#include "opencv2/highgui.hpp" #include "opencv2/opencv.hpp" #include "piBoard.h" #include "RS485Devices .h" int main(int argc, char* argv[]) { initializeBoard();刹车 = 0;速度 = 70; usmAngle = 5;值 = 4; setRS485ServoPosition(USM,0,usmAngle); setRS485ServoPosition(CAMERASERVO,0,value); ... initializeBoard() 位于 piBoard.h 文件中,setRS485...() 函数位于 RS485Devices.h 中。 piBoard.h 包含了 WiringPi 库。
  • 对不起,projectName.cpp = project.cpp
  • piBoard.h 和 RS485Devices.h 有支持的 .c 文件,我在 cmake 中编译了:add_executable(projectName project.cpp piBoard.c RS485Devices.c)。在单独的可执行文件和 target_link_libraries 中执行每个操作会有帮助吗?

标签: c++ c opencv cmake wiringpi


【解决方案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

这样做之后,一切都编译并运行了。

【讨论】:

  • extern 在应用于函数声明时不执行任何操作。只需extern "C" 就足够了。
  • 谢谢。我不熟悉 .h 文件,因为这是我第一次使用它们。我刚刚注意到,在wiringPiSerial.h 文件中,所有函数都是用extern 编写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多