【发布时间】:2019-04-26 22:42:38
【问题描述】:
所以,我正在为 RIOT OS 开发一个嵌入式库。由于我的库使用 Cmake,但 RIOT 使用简单的 Makefile,我只编译一个静态库,然后在编译时将其链接到 RIOT。所以我编译库:我将所有包含文件传递给 CMAKE_C_FLAGS 这是必需的,因为我的库使用 pthreads 并且 RIOT 支持它。
-DCMAKE_C_FLAGS="-I/home/citrullin/git/riot_libs/core/include -I/home/citrullin/git/riot_libs/drivers/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/boards/native/include -DNATIVE_INCLUDES -I/home/citrullin/git/riot_libs/boards/native/include/ -I/home/citrullin/git/riot_libs/core/include/ -I/home/citrullin/git/riot_libs/drivers/include/ -I/home/citrullin/git/riot_libs/cpu/native/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/cpu/native/include -I/home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/native/iota-wallet/src -I/home/citrullin/git/riot_libs/sys/posix/include -I/home/citrullin/git/riot_libs/sys/posix/pthread/include" .
所以效果很好。但不知何故,cmake 也试图包含 posix 的 linux 头文件。由于这是嵌入的,它不应该那样做。
Scanning dependencies of target iota_wallet
[ 11%] Building C object CMakeFiles/iota_wallet.dir/src/iota/addresses.c.obj
In file included from /usr/arm-none-eabi/include/sys/types.h:239:0,
from /usr/arm-none-eabi/include/stdio.h:61,
from /home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src/iota/common.h:4,
from /home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src/iota/addresses.c:2:
/usr/arm-none-eabi/include/sys/_pthreadtypes.h:154:20: note: previous declaration of 'pthread_mutex_t' was here
typedef __uint32_t pthread_mutex_t; /* identify a mutex */
那么,我的问题是:如何告诉 cmake 不包含 linux 头文件?
这是current CMakeList.txt I use.
/e 我对 Makefile 进行了同样的尝试。同样的问题出现在这里。
make -e CFLAGS="-isystem /usr/arm-none-eabi/include/newlib-nano -I/home/citrullin/git/riot_libs/core/include -I/home/citrullin/git/riot_libs/drivers/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/boards/bluepill/include -I/home/citrullin/git/riot_libs/boards/common/stm32f103c8/include -I/home/citrullin/git/riot_libs/cpu/stm32f1/include -I/home/citrullin/git/riot_libs/cpu/stm32_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include/vendor -I/home/citrullin/git/riot_libs/sys/libc/include -I/home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src -I/home/citrullin/git/riot_libs/sys/posix/include -I/home/citrullin/git/riot_libs/sys/posix/pthread/include" lib
arm-none-eabi-gcc -c -o build/addresses.o src/iota/addresses.c -isystem /usr/arm-none-eabi/include/newlib-nano -I/home/citrullin/git/riot_libs/core/include -I/home/citrullin/git/riot_libs/drivers/include -I/home/citrullin/git/riot_libs/sys/include -I/home/citrullin/git/riot_libs/boards/bluepill/include -I/home/citrullin/git/riot_libs/boards/common/stm32f103c8/include -I/home/citrullin/git/riot_libs/cpu/stm32f1/include -I/home/citrullin/git/riot_libs/cpu/stm32_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include -I/home/citrullin/git/riot_libs/cpu/cortexm_common/include/vendor -I/home/citrullin/git/riot_libs/sys/libc/include -I/home/citrullin/git/riot_libs/examples/iota_transaction_node/bin/pkg/bluepill/iota-wallet/src -I/home/citrullin/git/riot_libs/sys/posix/include -I/home/citrullin/git/riot_libs/sys/posix/pthread/include
In file included from /home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread.h:38:0,
from src/iota/conversion.h:13,
from src/iota/addresses.c:8:
/home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread_threading_attr.h:34:3: error: conflicting types for 'pthread_attr_t'
} pthread_attr_t;
^~~~~~~~~~~~~~
In file included from /usr/arm-none-eabi/include/sys/types.h:239:0,
from /usr/arm-none-eabi/include/stdio.h:61,
from src/iota/addresses.c:2:
/usr/arm-none-eabi/include/sys/_pthreadtypes.h:75:3: note: previous declaration of 'pthread_attr_t' was here
} pthread_attr_t;
^~~~~~~~~~~~~~
In file included from /home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread.h:38:0,
from src/iota/conversion.h:13,
from src/iota/addresses.c:8:
/home/citrullin/git/riot_libs/sys/posix/pthread/include/pthread_threading_attr.h:39:8: error: redefinition of 'struct sched_param'
struct sched_param {
^~~~~~~~~~~
In file included from /usr/arm-none-eabi/include/sys/_pthreadtypes.h:23:0,
from /usr/arm-none-eabi/include/sys/types.h:239,
from /usr/arm-none-eabi/include/stdio.h:61,
from src/iota/addresses.c:2:
/usr/arm-none-eabi/include/sys/sched.h:48:8: note: originally defined here
struct sched_param {
^~~~~~~~~~~
这些重复定义错误更多。看起来它们的性质都是一样的。
重现步骤:
克隆此repository(分支:iota_new_implementation)
cd 到文件夹 examples/iota_transaction_node
执行 make
带有 Makefile 的版本。提交:7e1d8884ab135ae64cee02c8c1a447015f4325bc
带有 CMake 的版本。提交:dbf32e727889afa3efb466cfdc8561e697af48b0
USEPKG += iota-wallet
在示例的 Makefile 中指的是this package。 This Makefile 用于制作静态库。
Cmake 日志:
生成文件:
【问题讨论】:
-
我不确定你是否可以在包含
stdlib.h... 时避免这样做? -
@Silmathoron 我在 RIOT 中把它改成了 native,所以使用 arm-none-eabi 编译器。我改变了问题。令人困惑的部分是 arm-none-eabi 包含 pthread 的头文件。这不应该存在,因为 arm-none-eabi 不针对任何供应商或操作系统。 pthreads 是操作系统特定的东西。
-
我对此感到有点惊讶......也许这是一个错误(怀疑)但也许你没有告诉编译器你认为你是什么。你能发布 cmake 配置日志吗?
-
我认为设置 -I 不足以进行交叉编译。见cmake.org/cmake/help/latest/manual/…。我注意到 RIOT OS 有这个用于生成工具链文件的帮助脚本。 github.com/RIOT-OS/RIOT/blob/master/dist/tools/cmake/…
-
@Fred 我链接了 repo,所以你可以复制它。我不确定,但我想我已经使用了工具链生成器。我可以用 Makefile 重现同样的问题。您可以在此处 (github.com/Citrullin/RIOT/commit/…) 看到 Makefile 在使用 cmake 之前的样子。
标签: makefile cmake gnu-make riot-os