我正在做一个cmake C/C++嵌入式项目。我有一个跨平台的应用程序。它将在基于PC的模拟器以及嵌入式(STM32)目标上运行。一个通用的硬件抽象层允许这样做。
理想情况下,我希望有一个针对目标特定硬件抽象层的库,例如,在为STM32编译时创建一个库,在为PC编译时创建另一个库)。这将链接到应用程序。尽管我并不真正需要它成为一个单独的库。
我遇到的问题是STM32的HAL库包含STM32的启动代码(asm)。构建并链接HAL库后,启动代码将消失。我可以直接在应用程序中包含启动代码,并且它是正确链接和定位的,但是如果为STM32构建,现在我需要在应用程序中包含该文件的特殊情况。
项目文件夹结构如下:
- TheProject
- Applications
- TheMainApplication
ApplicationSource.c
CMakeLists.txt (add_executable, add sources, link HAL library)
- HAL
- Embedded
- STM32
STM32SpecificCode.c
STM32StartupCode.s
CMakeLists.txt (add_library(STM32) target_sources(*.c, *.s))
- PC
- PC Specific
CMakeLists.txt (add_library(HAL) if(STM32) add_subdirectory(STM32) link STM32 library else if PC ...)
CMakeLists.txt (project(myproj) add_subdirectory(HAL) add_subdirectory(Applications/TheMainApplication) )实际上,有比我在这里提到的更多的目标和选项的组合,但为了简单起见,例如sake。
可能是我缺乏如何使用子文件夹的cmake知识,这让我很难做到这一点,或者是糟糕的项目结构!我非常希望得到一些建议或反馈,告诉我如何组织这段代码,让特定于STM32的文件保留在STM32代码中,如果可能的话,避免在应用程序makefile中出现特殊情况。或任何其他相关的建议。
谢谢
发布于 2019-12-07 03:27:28
将ARM向量表分配给特定的地址确实是通过gcc风格的工具链上的链接器部分来完成的,正如一些人在评论中提到的那样。在源代码中使用指令标记所需的链接器部分,然后将该部分指向链接器脚本中的特定区域。
链接器脚本几乎总是目标唯一的。即使它们不是,从理论上讲,它们分配未被任何代码使用的部分的位置也不是问题。
退回到你真正想要弄清楚的地方,一个生成本机可执行文件的构建系统总是必须包含目标唯一的部分。不同的工具链和目标需要不同的标志和输入。几乎不变的是,您需要在使用的源文件集中有一定程度的差异。
因此,一般而言,您要做的是组织您的构建系统,将所有目标通用的功能源及其公共依赖项进行分组。
然后,您为每个目标提供了一部分,这些目标提取公共源,添加目标唯一的源,如从源构建的I/O例程(或模拟),并提供适当的构建规则。最后一部分是传递适当的标志、要链接的预构建库,以及指定链接器脚本的位置。
https://stackoverflow.com/questions/59206837
复制相似问题