我正在尝试从Linux Ubuntu VirtualBox安装中建立针对Raspberry Pi的交叉编译流程。我克隆了工具存储库(而不是设置完整的crosstool-ng构建),并且能够编译基本的hellow world应用程序并在pi上运行它。现在,按照本教程,通过我的交叉编译流通过cmake来编译connectionpi库,从而尝试获得更复杂的示例: https://medium.com/@au42/the-useful-raspberrypi-cross-compile-guide-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) ;
^