清"undefined reference to function"

CMake "undefined reference to function"

本文关键字:function to undefined reference      更新时间:2023-10-16

我试图使用CMake链接库(BNO055驱动程序)。由于BNO055驱动程序不使用CMake,并且大约一年没有更改,我决定下载源文件并将它们放在我的项目中。

然后使用CMake创建一个库并链接它。

问题是链接似乎不工作。当我编译项目时,我得到一个undefined reference to <function>错误,其中<function>是由BNO055驱动程序定义的函数。

我是否错误地创建或链接了库?
我还需要做些什么来定义这些函数吗?

为了不粘贴200行代码,这里是一个简化的main.cpp,它产生与实际main.cpp相同的错误。如果你想看到真正的main.cpp,请点击下面的链接到Github repo

#include "bno055.h"
#include "mraa.hpp"
struct bno055_t bno055;
mraa::I2c *i2c(0);
int main() {
    bno055_init(&bno055);
    i2c->address(0x29);
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4)
project(imc-server)
# CMake
# -- Config
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
# Global
# -- Include
include(ExternalProject)
# BNO055
# -- Include
include_directories(${CMAKE_SOURCE_DIR}/bno055)
set(SOURCE_FILES ${SOURCE_FILES}
        ${CMAKE_SOURCE_DIR}/bno055/bno055.h
        ${CMAKE_SOURCE_DIR}/bno055/bno055.c)
# MRAA
# -- Build
externalProject_add(mraa
        GIT_REPOSITORY https://github.com/intel-iot-devkit/mraa.git
        GIT_TAG        v0.7.5
)
# Compile
# -- Source
set(SOURCE_FILES ${SOURCE_FILES}
        main.cpp)
# -- Create
add_executable(imc-server ${SOURCE_FILES})
add_dependencies(imc-server mraa)

Build Log相关部分

[ 90%] Linking CXX executable imc-server
CMakeFiles/imc-server.dir/test.cpp.o: In function `main':
/home/noah/Documents/Inertial-Motion-Capture/imc-server/test.cpp:8: undefined reference to `bno055_init(bno055_t*)'
CMakeFiles/imc-server.dir/test.cpp.o: In function `mraa::I2c::address(unsigned char)':
/usr/local/include/mraa/i2c.hpp:99: undefined reference to `mraa_i2c_address'
collect2: error: ld returned 1 exit status
make[2]: *** [imc-server] Error 1
make[1]: *** [CMakeFiles/imc-server.dir/all] Error 2
make: *** [all] Error 2

Project Github(39a6196)
建立日志

问题是BNO055库是用C编写的,而我的程序是用c++编写的。

我了解到,要使用C程序中定义的函数,在c++程序中,您必须将C库的包含包装在extern "C" {}块中,如下所示:

extern "C" {
    #include "bno055.h"
}
#include "mraa.hpp"
struct bno055_t bno055;
mraa::I2c *i2c(0);
int main() {
    bno055_init(&bno055);
    i2c->address(0x29);
}

从SOURCE_FILES中删除标题

set(SOURCE_FILES ${SOURCE_FILES}
        # ${CMAKE_SOURCE_DIR}/bno055/bno055.h
        ${CMAKE_SOURCE_DIR}/bno055/bno055.c)

CMake应该自己找到所需的头文件。include_directories