【已完美解决】scons问题求助:如何设置编译输出目录搞清楚后,有些编译输出的obj文件却在源码目录,而不是设置的输出目录。

news2024/11/27 21:34:44

【已完美解决】scons问题求助:如何设置编译输出目录搞清楚后,有些编译输出的obj文件却在源码目录,而不是设置的输出目录。

文章目录

  • 1 前置背景
  • 2 我的疑问
  • 3 一手点拨
  • 4 问题解决

1 前置背景

最近在基于目前已有的rt-thread构建框架,改造设计一套新的软件架构及构建,基于RA系列的BSP,使用scons的构建方式在windows的env环境下推进。

在这期间,参考了社区帖子 scons如何指定输出目录 , 基本能够实现将编译输出的obj文件导到编译输出目录,而不是在原来的源码目录。

但是,我发现了一个个例,以 bsp\renesas\ra2l1-cpk 为例,在它的原生的rt-thread env构建流程中也是存在这样的问题。

见下面执行scons的编译出:

CC build\kernel\src\kservice.o
CC build\kernel\src\mem.o
CC build\kernel\src\mempool.o
CC build\kernel\src\object.o
CC build\kernel\src\scheduler.o
CC build\kernel\src\thread.o
CC build\kernel\src\timer.o
CC build\ra_gen\common_data.o
CC build\ra_gen\hal_data.o
CC build\ra_gen\main.o
CC build\ra_gen\pin_data.o
CC build\ra_gen\vector_data.o
CC build\src\hal_entry.o
CC ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\startup.o
CC ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\system.o
CC ra\fsp\src\bsp\mcu\all\bsp_clocks.o
CC ra\fsp\src\bsp\mcu\all\bsp_common.o
CC ra\fsp\src\bsp\mcu\all\bsp_delay.o
CC ra\fsp\src\bsp\mcu\all\bsp_group_irq.o
CC ra\fsp\src\bsp\mcu\all\bsp_guard.o
CC ra\fsp\src\bsp\mcu\all\bsp_io.o
CC ra\fsp\src\bsp\mcu\all\bsp_irq.o
CC ra\fsp\src\bsp\mcu\all\bsp_register_protection.o
CC ra\fsp\src\bsp\mcu\all\bsp_rom_registers.o
CC ra\fsp\src\bsp\mcu\all\bsp_sbrk.o
CC ra\fsp\src\bsp\mcu\all\bsp_security.o
CC ra\fsp\src\r_icu\r_icu.o
CC ra\fsp\src\r_ioport\r_ioport.o
CC ra\fsp\src\r_sci_uart\r_sci_uart.o
CC D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_common.o
CC D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_gpio.o
CC D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.o
D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.c: In function 'ra_uart_transmit':
D:\llc\git_repos\rt-thread-share\rt-thread-share\rtt-5.0\rt-thread\bsp\renesas\libraries\HAL_Drivers\drv_usart_v2.c:260:21: warning: variable 'uart' set but not used [-Wunused-but-set-variable]
  260 |     struct ra_uart *uart;
      |                     ^~~~
LINK rtthread.elf
arm-none-eabi-objcopy -O ihex rtthread.elf rtthread.hex
arm-none-eabi-size rtthread.elf
   text    data     bss     dec     hex filename
  87364    1592    4728   93684   16df4 rtthread.elf
scons: done building targets.

注意看 ra目录下的几个obj文件,比如 (CC ra\fsp\src\bsp\mcu\all\bsp_clocks.o),输出都是在源码目录,而其他的与ra同级的目录,比如ra_gen都是在build目录往下存放(rt-thread的build tool默认将obj文件放在build目录)。

起初,我以为是ra目录下的SConscript文件和ra_gen目录下的SConscript文件有些区别,但我看了内容了,实在没想明白,为啥ra目录下的源码编译输出的obj文件就在源码目录,而ra_gen目录的源码却不会这样。

bsp顶级目录的SConscript文件内容:

# for module compiling
import os
Import('RTT_ROOT')
Import('rtconfig')
from building import *
cwd = GetCurrentDir()
src = []
CPPPATH = []
list = os.listdir(cwd)
if rtconfig.PLATFORM in ['iccarm']:
    print("\nThe current project does not support IAR build\n")
    Return('group')
elif rtconfig.PLATFORM in ['gcc', 'armclang']:
    if GetOption('target') != 'mdk5':
        CPPPATH = [cwd + './src']
        src = Glob('./src/*.c')
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
for d in list:
    path = os.path.join(cwd, d)
    if os.path.isfile(os.path.join(path, 'SConscript')):
        group = group + SConscript(os.path.join(d, 'SConscript'))
Return('group')

ra目录下的SConscript文件内容:

Import('RTT_ROOT')
Import('rtconfig')
from building import *
cwd = GetCurrentDir()
src = []
group = []
CPPPATH = []
if rtconfig.PLATFORM in ['iccarm']:
    print("\nThe current project does not support IAR build\n")
    Return('group')
elif rtconfig.PLATFORM in ['gcc', 'armclang']:
    if GetOption('target') != 'mdk5':
        src += Glob(cwd + '/fsp/src/bsp/mcu/all/*.c')
        src += [cwd + '/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c']
        src += [cwd + '/fsp/src/bsp/cmsis/Device/RENESAS/Source/startup.c']
        src += Glob(cwd + '/fsp/src/r_*/*.c')
        CPPPATH = [ cwd + '/arm/CMSIS_5/CMSIS/Core/Include',
                    cwd + '/fsp/inc',
                    cwd + '/fsp/inc/api',
                    cwd + '/fsp/inc/instances',]
group = DefineGroup('ra', src, depend = [''], CPPPATH = CPPPATH)
Return('group')
ra_gen目录下的SConscript文件内容:

Import('RTT_ROOT')
Import('rtconfig')
from building import *
cwd = GetCurrentDir()
src = []
group = []
CPPPATH = []
if rtconfig.PLATFORM in ['iccarm']:
    print("\nThe current project does not support IAR build\n")
    Return('group')
elif rtconfig.PLATFORM in ['gcc', 'armclang']:
    if GetOption('target') != 'mdk5':
        src = Glob('*.c')
        CPPPATH = [cwd, ]
group = DefineGroup('ra_gen', src, depend = [''], CPPPATH = CPPPATH)
Return('group')

ra目录的编译输出存放在源码目录:
在这里插入图片描述

ra_gen目录的编译输出存放在build目录下:
在这里插入图片描述

bsp的目录结构大致长这样:
在这里插入图片描述

2 我的疑问

对此,我有几个疑问:

  • 为啥ra目录和ra_gen目录的会有这个差别?而且我发现,瑞萨这几款bsp都有类似的问题
  • 到底是顶级的SConscript文件决定了上面的现象还是ra目录下的SConscript文件导致的?
  • 要想把ra目录下的生成文件也像ra_gen目录下的编译一样,存放在build目录下,要怎么修改?

以上问题,如果有大佬了解的,还请指导指导,多谢多谢。

3 一手点拨

帖子一经发出,就得到了大佬的点拨:
在这里插入图片描述
在这里插入图片描述
同时也引来了大佬的热议,包括我也参与了进去,从大佬的回复,我突然想到可能是 绝对路径和相对路径 的问题。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4 问题解决

非常高兴,经上面大佬们的点拨,基本确认了,果然就是ra目录下SConscript文件定义src使用了 绝对路径, 而不是 相对路径,从而引发问题的。

再次感谢大佬们的点拨,真的是一语惊醒梦中人。社区力量就是强大,总有意向不大的收获!

目前问题已经得到解决,参考下面的记录。

修改的地方正是 ra目录下的SConscript文件

screenshot_image.png

修改后的编译输出:

screenshot_image.png

obj文件生成的验证:

screenshot_image.png

完美手工。

@recan

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring源码解读一】IoC容器之AnnotationConfigApplicationContext

根据AnnotationConfigApplicationContext类去阅读其将Bean对象交给IoC容器管理的过程。以下这三个代码块是将配置类注册进IoC容器的例子。下面是关于这个类的继承与实现的类图关系树。 public class Test {public static void main(String[] args) {// 配置类注册进IoC容器App…

解决Ubuntu16中安装opencv后找不到vtk库的问题

最近一个项目中要用到OpenCV的VTK库&#xff0c;但引入头文件#include <opencv2/viz.hpp>时却说找不到这个库&#xff0c;网上搜了下说在编译opencv源码的时候&#xff0c;需要加上编译VTK库的选项&#xff0c;于是重新下载、编译、安装了源码&#xff0c;在cmake时加上了…

最流行的AI绘图工具Midjourney,你不得不知道的使用技巧

​关注文章下方公众号&#xff0c;可免费获取AIGC最新学习资料 本文字数&#xff1a;1500&#xff0c;阅读时长大约&#xff1a;10分钟 Midjourney成为了最受欢迎的生成式AI工具之一。它的使用很简单。输入一些文本&#xff0c;Midjourney背后的大脑&#xff08;或计算机&#…

Linux 权限

目录 一、 从问题开始 问题一: 什么叫shell? 问题二: 为什么不能直接使用kernel呢? 问题三: shell 与bash 有什么不同吗? 二、 Linux权限 0x01 Linux用户 0x02 切换用户命令 0x03 sudo命令 0x04 权限的相关概念 0x05 chmod 0x06 chown 0x07 chgrp 0x08 文件权…

重磅!软著申请不需要邮寄纸质材料啦,附软著申请流程。

重磅&#xff01;软著申请不需要邮寄纸质材料啦&#xff0c;附软著申请流程。 最新消息申请流程一&#xff0c;准备申请材料二&#xff0c;申请人填写申请表三&#xff0c;提交申请材料四&#xff0c;补正五&#xff0c;审查六&#xff0c;发布公告七&#xff0c;接受异议八&am…

力扣---二叉树OJ题(多种题型二叉树)

文章目录 前言&#x1f31f;一、剑指 Offer 55 - I. 二叉树的深度&#x1f30f;1.1 链接&#xff1a;&#x1f30f;1.2 代码一&#xff1a;&#x1f30f;1.3 代码二&#xff1a;&#x1f30f;1.4 流程图&#xff1a; &#x1f31f;二、100. 相同的树&#x1f30f;2.1 链接&…

超强实用!利用xfsdump和xfsrestore打造无懈可击的数据备份与恢复策略

前言 上次我们分析了EXT文件系统的恢复方式&#xff0c;借助于extundelete工具仅可以恢复EXT类型的文件&#xff0c;但无法恢复CentOS 7系统&#xff0c;因为centos7默认采用xfs类型的文件。 xfs文件系统恢复工具有以下几种&#xff1a; xfsprogs&#xff1a;xfs文件系统扩展…

HTB MonitorsTwo

MonitorsTwo HTB MonitorsTwo 老规矩信息收集了&#xff1a; NMAP信息收集 ┌──(kali㉿kali)-[~/桌面] └─$ sudo nmap --min-rate 1000 10.10.11.211 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-19 09:18 CST Nmap scan report for 10.10.11.211 Host is up…

Python入门(十六)函数(四)

函数&#xff08;四&#xff09; 1.传递列表1.1 在函数中修改列表 2.传递任意数量的实参2.1 结合使用位置实参和任意数量实参2.2 使用任意数量的关键字实参 作者&#xff1a;Xiou 1.传递列表 我们经常会发现&#xff0c;向函数传递列表很有用&#xff0c;其中包含的可能是名字…

设计模式-模板方法模式

模板方法模式 问题背景解决方案&#xff1a;模板方法模式基本介绍解决问题代码示例运行结果 钩子方法注意事项和细节 问题背景 豆浆的制作&#xff1a; 1&#xff09;制作豆浆的流程&#xff1a;选材—>添加配料—>浸泡—>放到豆浆机打碎 2&#xff09;通过添加不同…

高可用性和双机热备浅析

在用户眼里&#xff0c;业务需要永远正常对外提供服务&#xff0c;这就要求应用系统的高可用&#xff08;High availability&#xff0c;即 HA&#xff09;。高可用主要是针对架构而言&#xff0c;第一步一般会采用分层的思想将一个庞大的应用系统拆分成应用层、中间件、数据存…

SpringBoot+MyBatis-plus实现CRUD (踩坑总结!!!)

一、创建项目&#xff0c;引入相应的依赖 (项目源码在文末) &#xff08;不要选Module !!!!&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version&g…

linux常见的二十多个指令

目录 一、指令的概念 二、28个常见的指令 ⭐2.1 ls指令 ⭐2.2 pwd指令 ⭐2.3 cd指令 ⭐2.4tree指令 ⭐2.5 mkdir指令 ⭐2.6 touch指令 ⭐2.7 rmdir指令 ⭐2.8 rm指令 ⭐2.9 clear指令 ⭐2.10 man指令 ⭐2.11 cp指令 ⭐2.12 mv指令 ⭐2.13 cat指令&#xff08;适…

正规文法、正规表达式、有限自动机及其之间的转换(笔记)

The Equivalent Transforming among RG, RE and FA 正规文法 A Grammar G is a quadruple (四元组):G (VN, VT, S, P ) Where, VN is a finite set of nonterminals.VT is a finite set of terminals.S is the start symbol, S ∈ \in ∈ VN.P is a finite set of product…

.Net 使用OpenAI开源语音识别模型Whisper

.Net 使用OpenAI开源语音识别模型 Whisper 前言 Open AI在2022年9月21日开源了号称其英文语音辨识能力已达到人类水准的 Whisper 神经网络&#xff0c;且它亦支持其它98种语言的自动语音辨识。 Whisper系统所提供的自动语音辨识&#xff08;Automatic Speech Recognition&…

python基础知识(四):input语句、if语句和pass语句

目录 1. input语句2. 强制转换3. if语句4. pass语句 1. input语句 input语句是程序获取从键盘输入的内容&#xff0c;会把输入的内容自动转换成字符串。 使用方法: 变量名 input(“提示语”) 例如 language input("你最爱什么语言?") print(language)这两行代码…

RK3588平台开发系列讲解(项目篇)常见模型结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、DNN二、CNN三、RNN沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)…

Vue中组件的几个重要点

1 单词命名组件名称 vue推荐的命名组件名称有以下几种&#xff1a; 首先看下组件有几个单词构成 单个单词 如果只有一个单词&#xff0c;那么建议全部小写&#xff0c;用的时候也是全部小写的&#xff0c;或者首字母大写 有人喜欢哪怕只有一个单词也首字母大写&#xff0c;…

读论文-GPRAR

论文&#xff1a;GPRAR: Graph Convolutional Network based Pose Reconstruction and Action Recognition for Human Trajectory Prediction&#xff08;2016&#xff09; 摘要 高精度的预测对于自动驾驶等各种应用至关重要。现有的预测模型在现实世界中很容易出错&#xff0…

linux【网络编程】之HTTP协议

一文了解应用层协议&#xff1a;HTTP协议 一、HTTP协议二、URL2.1 urlencode和urldecode 三、HTTP协议格式3.1 HTTP请求方法3.2 HTTP状态码3.3 HTTP响应报头 四、结合代码理解HTTP通信流程五、长连接六、http会话保持七、postman和fiddler 一、HTTP协议 在上篇文章中我们模拟了…