为AVR生成代码时的cmake构建问题

时间:2019-03-17 19:48:43

标签: cmake avr

我正在尝试为avr atmega328p建立一个示例项目。我面临一个奇怪的问题。我有以下目录结构。

inc/core/device_support.h
src/main.c
src/core/device_support.c

我有两个项目设置,一个使用make,另一个使用cmake。当我使用make进行构建时,一切正常。但是当我使用cmake时,它无法编译。 (如果我运行avr-size -A myProject.elf,.text部分不相同,并且在目标MCU上无法正确运行。)但是,如果我在cmake项目目录中以build目录作为工作目录手动运行compile命令,那么一切正常。

我已将问题缩小为以下事实:如果我们从核心/home/user/avr/build/core运行编译命令,则无法运行,如果我在/home/user/avr/build构建目录中运行命令,则可以正常工作。我不知道为什么会发生这种情况。

我的问题是,为什么在不同目录下会搞乱编译,如何在cmake中修复它。

有了make,我会得到类似的东西:

avr-gcc -DARDUINO=10808 -DF_CPU=160000000L -I/home/user/avr/inc/core -mmcu=atmega328p -ffunction-sections -fdata-sections -MMD -flto -std=gnu11 -fno-fat-lto-objects -Os -w -g -MD -MT /home/user/avr/src/core/device_support.c -o /home/user/avr/build/core/device_support.o

以及使用cmake自动生成的脚本,我有:

cd /home/user/avr/build/core && avr-gcc -DARDUINO=10808 -DF_CPU=160000000L -I/home/user/avr/inc/core -mmcu=atmega328p -ffunction-sections -fdata-sections -MMD -flto -std=gnu11 -fno-fat-lto-objects -Os -w -g -MD -MT -o src/CMakeFiles/core.dir/src/core/device_support.o /home/user/avr/src/core/device_support.c

更新01:

avr-size-myProject.elf输出(cmake):

 section                    size      addr
.data                         0   8388864
.text                       740         0
.bss                          9   8388864
.comment                     17         0
.note.gnu.avr.deviceinfo     64         0
.debug_aranges              120         0
.debug_info                3537         0
.debug_abbrev              1965         0
.debug_line                1044         0
.debug_frame                124         0
.debug_str                 1175         0
.debug_loc                  843         0
.debug_ranges                40         0
Total                      9678

avr-size-myProject.elf输出(make):

    section                     size      addr
.data                          0   8388864
.text                        930         0
.bss                           9   8388864
.comment                      17         0
.note.gnu.avr.deviceinfo      64         0
.debug_aranges               104         0
.debug_info                 3559         0
.debug_abbrev               2002         0
.debug_line                 1134         0
.debug_frame                 180         0
.debug_str                  1139         0
.debug_loc                  1154         0
.debug_ranges                 24         0
Total                      10316

您可以在.text部分中看到不同之处。它是一个简单的led闪烁代码,当我在cmake情况下在设备上运行此代码时,LED有时保持点亮状态,而另一些则完全熄灭。而且,如果我通过从cmake的输出运行相同的命令来手动编译相同的代码,但是将build目录作为我的工作目录,则LED会按预期闪烁。

在任何一种情况下,构建期间均无错误。唯一的区别是在构建目录中。如果我是手动构建的,而我的工作目录不是构建的,则在这种情况下也会失败。出于某种原因,在编译期间进入构建目录很重要,我不知道为什么。

更新02: 示例代码已上传至:https://github.com/systemangle/mcve_avr

请参阅项目自述文件。

1 个答案:

答案 0 :(得分:0)

出于某种原因,在编译期间进入构建目录很重要,我不知道为什么

那么您可能已经有了答案。这个问题似乎与CMake无关。 也许您可以尝试使用cmake进行源代码构建,然后看看会发生什么。 否则,如果您想模仿手写的Makefile行为,则可以避免使用任何add_sub目录,而仅在项目的根目录下写一个大的CMakeLists.txt。

话虽如此,如果编译输出随所在位置的不同而变化,那么我认为最好向提供交叉编译器的人员询问这种奇怪行为的问题

您是否尝试在其他目录中手动编译文件? 这会改变输出的目标文件吗?