CMake 库链接不正确
CMake Library not linking correctly
我正在尝试编写一个使用 BNO055 Driver 的程序。我已经尝试了很多不同的方法 link 将这个库应用到我的项目中。
由于 BNO055 驱动程序未附带任何构建系统设置或构建的库,因此我必须以某种方式包含该驱动程序。
对于以下每次尝试,我都会遇到构建错误:
[100%] Linking CXX executable imc-server
CMakeFiles/imc-server.dir/main.cpp.o: In function `bno055_read_data()':
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:83: undefined reference to `bno055_init(bno055_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:84: undefined reference to `bno055_set_power_mode(unsigned char)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:86: undefined reference to `bno055_set_operation_mode(unsigned char)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:91: undefined reference to `bno055_read_quaternion_wxyz(bno055_quaternion_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:97: undefined reference to `bno055_read_linear_accel_xyz(bno055_linear_accel_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:98: undefined reference to `bno055_convert_double_linear_accel_xyz_msq(bno055_linear_accel_double_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:101: undefined reference to `bno055_set_power_mode(unsigned char)'
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
这是我在库未正确 link 编辑时经常看到的那种错误。
尝试 1 - 包括 BNO055 驱动源
我首先尝试采用一种简单的方法,只在我的可执行文件中包含驱动程序源代码(bno055.h
和 bno055.c
):
#CMakeLists.txt
set(SOURCE_FILES ${SOURCE_FILES}
${CMAKE_SOURCE_DIR}/bno055/bno055.h
${CMAKE_SOURCE_DIR}/bno055/bno055.c)
[...]
set(SOURCE_FILES ${SOURCE_FILES}
main.cpp)
add_executable(imc-server ${SOURCE_FILES})
尝试 2 - 从驱动程序源和 link
构建库文件
后来我尝试为 BNO055 驱动程序构建一个库,然后 link 将它添加到我的可执行文件中:
#In BNO055 sub-directory CMakeLists.txt
add_library(bno055 ${CMAKE_CURRENT_SOURCE_DIR}/bno055.c)
target_include_directories(bno055 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
#In Main CMakeLists.txt
add_subdirectory(bno055)
[...]
add_executable(imc-server main.cpp)
target_link_libraries(imc-server bno055)
这两次尝试都失败了,据我所知,它们应该 link 正确。这让我相信
a) 我 linkBNO055 库不正确
或
b) 我必须做一些特别的事情来允许 BNO055 驱动程序与我的程序一起工作
我已经查看了许多与我遇到的构建错误相关的其他 SO 问题,到目前为止我找到的所有解决方案都没有帮助。
链接
Project Github Repo(/imc-server
下的代码)
- Commit 39a6196
, Attempt 1
- Commit e64e7c8
, Attempt 2
BNO055 Driver
您将 C header 包含到 C++ 源代码中,但没有将其包装到 extern "C" { }
块中。 driver代码编译为C,因为CMake是按文件扩展名选择编译模式的。
在没有 extern "C" {}
的情况下构建 .c 和 .cpp
把main.cpp改成main.c,你就解决了这个问题
set(SOURCE_FILES ${SOURCE_FILES}
main.c)
我正在尝试编写一个使用 BNO055 Driver 的程序。我已经尝试了很多不同的方法 link 将这个库应用到我的项目中。
由于 BNO055 驱动程序未附带任何构建系统设置或构建的库,因此我必须以某种方式包含该驱动程序。
对于以下每次尝试,我都会遇到构建错误:
[100%] Linking CXX executable imc-server
CMakeFiles/imc-server.dir/main.cpp.o: In function `bno055_read_data()':
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:83: undefined reference to `bno055_init(bno055_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:84: undefined reference to `bno055_set_power_mode(unsigned char)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:86: undefined reference to `bno055_set_operation_mode(unsigned char)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:91: undefined reference to `bno055_read_quaternion_wxyz(bno055_quaternion_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:97: undefined reference to `bno055_read_linear_accel_xyz(bno055_linear_accel_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:98: undefined reference to `bno055_convert_double_linear_accel_xyz_msq(bno055_linear_accel_double_t*)'
/home/noah/Documents/Inertial-Motion-Capture/imc-server/main.cpp:101: undefined reference to `bno055_set_power_mode(unsigned char)'
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
这是我在库未正确 link 编辑时经常看到的那种错误。
尝试 1 - 包括 BNO055 驱动源
我首先尝试采用一种简单的方法,只在我的可执行文件中包含驱动程序源代码(bno055.h
和 bno055.c
):
#CMakeLists.txt
set(SOURCE_FILES ${SOURCE_FILES}
${CMAKE_SOURCE_DIR}/bno055/bno055.h
${CMAKE_SOURCE_DIR}/bno055/bno055.c)
[...]
set(SOURCE_FILES ${SOURCE_FILES}
main.cpp)
add_executable(imc-server ${SOURCE_FILES})
尝试 2 - 从驱动程序源和 link
构建库文件
后来我尝试为 BNO055 驱动程序构建一个库,然后 link 将它添加到我的可执行文件中:
#In BNO055 sub-directory CMakeLists.txt
add_library(bno055 ${CMAKE_CURRENT_SOURCE_DIR}/bno055.c)
target_include_directories(bno055 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
#In Main CMakeLists.txt
add_subdirectory(bno055)
[...]
add_executable(imc-server main.cpp)
target_link_libraries(imc-server bno055)
这两次尝试都失败了,据我所知,它们应该 link 正确。这让我相信
a) 我 linkBNO055 库不正确
或
b) 我必须做一些特别的事情来允许 BNO055 驱动程序与我的程序一起工作
我已经查看了许多与我遇到的构建错误相关的其他 SO 问题,到目前为止我找到的所有解决方案都没有帮助。
链接
Project Github Repo(/imc-server
下的代码)
- Commit 39a6196
, Attempt 1
- Commit e64e7c8
, Attempt 2
BNO055 Driver
您将 C header 包含到 C++ 源代码中,但没有将其包装到 extern "C" { }
块中。 driver代码编译为C,因为CMake是按文件扩展名选择编译模式的。
在没有 extern "C" {}
把main.cpp改成main.c,你就解决了这个问题
set(SOURCE_FILES ${SOURCE_FILES}
main.c)