我正在尝试从 Linux Ubuntu VirtualBox 安装中设置针对 Raspberry Pi 的交叉编译流程。我克隆了工具 repo(而不是建立一个完整的 crosstool-ng 构建)并且能够编译一个基本的 hello world 应用程序并在我的 pi 上运行它。我现在正在尝试通过我通过 cmake 的交叉编译流程编译wiringpi库来获得更复杂的示例,遵循本教程: https ://medium.com/@au42/the-useful-raspberrypi-cross-compile-指南-ea56054de187
不幸的是,它不起作用 - 由于未声明的函数,我收到编译错误,这些函数看起来像标准 C 库 (time.h)。第一个 c 文件 (softpwm.c) 编译相对容易,但第二个 (wiringPi.c) 错误,因为它包含 time.h - 并引用其中定义的常量。
据我所知,gcc 的交叉编译版本没有在适当的目录中查找系统库头文件(usr/include/linux|sys|bits)。我已经验证 time.h 确实位于传递给 cmake 的工具链文件指定的 sysroot 路径中。
请注意,我在这里没有编写任何代码,我只是想重现本教程,该教程使用交叉编译工具链构建 WiringPi 的交叉编译版本。
我试图在我的 CMakeLists.txt 文件中添加特定的包含目录,但这会产生其他编译错误。第一个库无法构建,因为现在它无法找到 pthreads 包。
我还使用我的交叉编译流程使用基本 time.h 成功构建了一个 GNU 示例,以查看工具安装是否存在问题。这编译得很好。
我打开了详细的 makefile、-v 和 -Wall 选项,以努力了解正在发生的事情以及可能缺少的内容。
cmake . -DCMAKE_TOOLCHAIN_FILE=Toolchain-rpi.cmake
make
还有我的 Toolchain-rpi.cmake 文件:
# Define our host system
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(PITOOL "/home/greg/sanitaslabs/cacheq/raspi/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf")
#set(SYSROOT "${PITOOL}/arm-linux-gnueabihf/sysroot")
set(SYSROOT "${PITOOL}/arm-linux-gnueabihf/sysroot")
# Define the cross compiler locations
#SET(CMAKE_C_COMPILER /home/greg/sanitaslabs/cacheq/raspi/tools/arm-
bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_C_COMPILER ${PITOOL}/bin/arm-linux-gnueabihf-gcc)
#SET(CMAKE_CXX_COMPILER
/home/greg/sanitaslabs/cacheq/raspi/tools/arm-bcm2708/arm-rpi-4.9.3-
linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${PITOOL}/bin/arm-linux-gnueabihf-g++)
# Define the sysroot path for the RaspberryPi distribution in our
tools folder
#SET(CMAKE_FIND_ROOT_PATH ${SYSROOT})
# Use our definitions for compiler tools
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Search for libraries and headers in the target directories only
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
add_definitions(-v -Wall -std=c11)
错误:
/home/greg/sanitaslabs/cacheq/raspi/wiringPi/wiringPi/wiringPi.c:2058:3: warning: implicit declaration of function 'clock_gettime' [-Wimplicit-function-declaration]
clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ;
^
/home/greg/sanitaslabs/cacheq/raspi/wiringPi/wiringPi/wiringPi.c:2058:18: error: 'CLOCK_MONOTONIC_RAW' undeclared (first use in this function)
clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ;
^