CMake "undefined reference to function"
CMake "undefined reference to function"
我正在尝试使用 CMake 来 link 一个库 (BNO055 Driver)。由于 BNO055 驱动程序不使用 CMake,并且大约一年没有更改,我决定只下载源文件并将它们放入我的项目中。
然后我使用 CMake 创建一个库并 link 它。
问题是 link 似乎不起作用。当我编译项目时出现 undefined reference to <function>
错误,其中 <function>
是由 BNO055 驱动程序定义的函数。
我是否错误地创建或link创建了库?
我需要做其他事情来定义这些函数吗?
为了不粘贴 200 行代码,这里是一个简化的 main.cpp
,它会产生与真实 main.cpp
相同的错误。如果您想查看真正的 main.cpp
,请按照下面的 link 到 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)
生成日志的相关部分
[ 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
)
Build Log
从您的 SOURCE_FILES 中删除 header。
set(SOURCE_FILES ${SOURCE_FILES}
# ${CMAKE_SOURCE_DIR}/bno055/bno055.h
${CMAKE_SOURCE_DIR}/bno055/bno055.c)
CMake 应该会自行找到所需的 header。 include_directories
找到其他包含
问题是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);
}
我正在尝试使用 CMake 来 link 一个库 (BNO055 Driver)。由于 BNO055 驱动程序不使用 CMake,并且大约一年没有更改,我决定只下载源文件并将它们放入我的项目中。
然后我使用 CMake 创建一个库并 link 它。
问题是 link 似乎不起作用。当我编译项目时出现 undefined reference to <function>
错误,其中 <function>
是由 BNO055 驱动程序定义的函数。
我是否错误地创建或link创建了库?
我需要做其他事情来定义这些函数吗?
为了不粘贴 200 行代码,这里是一个简化的 main.cpp
,它会产生与真实 main.cpp
相同的错误。如果您想查看真正的 main.cpp
,请按照下面的 link 到 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)
生成日志的相关部分
[ 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
)
Build Log
从您的 SOURCE_FILES 中删除 header。
set(SOURCE_FILES ${SOURCE_FILES}
# ${CMAKE_SOURCE_DIR}/bno055/bno055.h
${CMAKE_SOURCE_DIR}/bno055/bno055.c)
CMake 应该会自行找到所需的 header。 include_directories
问题是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);
}