我正在尝试为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
请参阅项目自述文件。
答案 0 :(得分:0)
出于某种原因,在编译期间进入构建目录很重要,我不知道为什么
那么您可能已经有了答案。这个问题似乎与CMake无关。 也许您可以尝试使用cmake进行源代码构建,然后看看会发生什么。 否则,如果您想模仿手写的Makefile行为,则可以避免使用任何add_sub目录,而仅在项目的根目录下写一个大的CMakeLists.txt。
话虽如此,如果编译输出随所在位置的不同而变化,那么我认为最好向提供交叉编译器的人员询问这种奇怪行为的问题
您是否尝试在其他目录中手动编译文件? 这会改变输出的目标文件吗?