CMake " неопределенная ссылка на функцию"

Я пытаюсь использовать CMake для связывания библиотеки (драйвер BNO055). Поскольку драйвер BNO055 не использует CMake, и он не был изменен около года, я решил просто загрузить исходные файлы и поместить их в свой проект.

затем я использую CMake для создания библиотеки и ее связывания.

проблема в том, что ссылка, похоже, не работает. Когда я компилирую проект, я получаю undefined reference to <function> ошибки, где <function> является функцией, определенной BNO055 водитель.

Я создаю или связываю библиотеку неправильно?
Нужно ли делать что-то еще, чтобы определить эти функции?

ради того, чтобы не вставлять в 200 строк кода, вот упрощенный main.cpp это приводит к той же ошибке, что и реальная main.cpp. Если вы хотите увидеть настоящий main.cpp следуйте по ссылке ниже к репозиторию Github

#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

Проект Github(39a6196)
Построить Отчет

2 ответов


проблема заключалась в том, что библиотека BNO055 была написана на C, а моя программа-на C++.

я узнал, что для использования функции, определенной в программе C, в программе c++, вы должны обернуть include библиотеки 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