Windows上的跨平台编译问题 我正在学习如何在C++ Windows上用C++编写一个跨平台编译器并有问题。我已经尽了我所能,但没有成功。任何帮助都将不胜感激。 我已经在我的Windows机器上安装了CYGWIN64和gcc-arm-none-eabi-10-2020-q4-major

Windows上的跨平台编译问题 我正在学习如何在C++ Windows上用C++编写一个跨平台编译器并有问题。我已经尽了我所能,但没有成功。任何帮助都将不胜感激。 我已经在我的Windows机器上安装了CYGWIN64和gcc-arm-none-eabi-10-2020-q4-major,arm,g++,cygwin,cross-platform,Arm,G++,Cygwin,Cross Platform,我的代码: #包括 int main() { std::cout我不认为你的问题与cygwin或windows有关。你在Linux上也会遇到同样的错误。顺便说一句,如果你有windows 10并且不介意Hyper-V,那么理论上你可以使用windows subsystem for Linux并在你的项目上使用Linux工具链(甚至在窗口内) 更多的是关于编译的嵌入式本质,在x86上,我们假设我们有一个操作系统,它提供系统调用,已经启动并初始化了内存和外围设备,它有一个控制台/标准输出可用于应用程

我的代码:

#包括
int main()
{

std::cout我不认为你的问题与cygwin或windows有关。你在Linux上也会遇到同样的错误。顺便说一句,如果你有windows 10并且不介意Hyper-V,那么理论上你可以使用windows subsystem for Linux并在你的项目上使用Linux工具链(甚至在窗口内)

更多的是关于编译的嵌入式本质,在x86上,我们假设我们有一个操作系统,它提供系统调用,已经启动并初始化了内存和外围设备,它有一个控制台/标准输出可用于应用程序。虽然裸机中的情况非常不同,但在实现主功能之前,您必须做很多工作执行代码。您使用的是Arm编译器,它不知道您使用的是哪块板,它将有什么内存映射,它将包括什么外围设备。它需要做什么?在UART上输出(波特率是多少,哪个UART,如果有多个),在LCD上输出(什么样的LCD,使用什么样的驱动程序,如何连接,SPI或其他方式,该LCD的这些设置是什么)…这就是为什么很多嵌入式项目都会“闪烁”,因为它们的hello world在某些GPIO端口上闪烁某些LED或切换值通常更容易测试、更容易实现并且是特定的,我们预计某些端口或LED会变高或变低,而使用
cout
则可能意味着任何事情,而某些目标甚至可能没有办法ake完全不能工作(没有UART,没有连接LCD的SPI,没有半主机)

对于
iostream
和嵌入式设备,它可能意味着很多事情,像这样使用它永远不会起作用。供应商通常为他们的设备提供HAL,通常与他们的工具链(或IDE)捆绑在一起它有存根来初始化设备并实现系统调用,如_open、_write、_close等。然后像iostream这样的调用可以用来打开“文件”,在这种情况下可以实现打开UART,每个“printf”将使用putc,而这将使用写入,它们的HAL实现

我建议使用一些供应商IDE(取决于您打算使用的目标板),我至少可以想到其中的一些,它们捆绑了Arm工具链并支持Windows和Linux,因此您的跨平台工作。我不打算命名它们,因为我想保持公正(我为一家供应商工作),但它们很容易在谷歌上搜索到,当你可能想针对某个特定的目标时,我是否会列出一些并不重要

如果你想让代码在目标之间可以转换,那么我建议你在没有限制的情况下开始,与一个供应商合作,并习惯HAL/启动代码的功能。然后,我可能会包装并进行一些抽象,并与其他供应商进行试验,以了解他们的HAL将做什么

如果有这样的通用代码,那么它就不会像开箱即用的那样工作。您需要一些弱链接的函数实现,如putchar,这样每个供应商就可以实现该函数,只需调用其HAL。本质上做:

->->->

欲了解更多信息,这里有一点关于

例如,对于这个跨目标printf实现,每个用户都必须实现_putchar,因为他不知道printf将使用什么、如何使用以及在哪里使用

也许你不应该制作一个多目标应用程序,而是一个通用的可插拔库,这样用户就可以将它添加到他们的应用程序中,而不是使用你的。因为无论你尝试多普通,你的应用程序都不会以一种形式工作。每个供应商都有自己的启动代码、HAL、链接器脚本,以及一种在他们的ecosyst中组织项目工作的方法em.没有一个系统可以兼容所有人,因此如果你想成为可移植的,你必须允许用户使用他们的供应商推荐的任何东西,然后从他们的应用程序中调用你的库


我强烈建议放弃可移植性,让某些东西首先在一台主机、一个工具链和一个目标上工作,获得一些工作经验和知识,然后再尝试使这些东西可移植和通用。

从哪里来
gcc-arm-none-eabi-10-2020-q4-major
?一个链接会很好。似乎你错过了ARM的C库。请显示用于调用交叉编译器的命令行。我从该网站下载了gcc-ARM-none-eabi-10-2020-q4-major:。此外,我从windows计算机上安装的CYGWIN64键入此命令:ARM-none-eabi-g++helloworld.cpp-o helloworld
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/cross 
gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib/gcc/arm-none-
eabi/10.2.1/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): in 
function `exit': exit.c:(.text.exit+0x2c): undefined reference to `_exit'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../l 
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe:
C:\cygwin64\tmp\cckThWXU.o: in function `m
ain': helloworld.cpp:(.text+0x34): undefined reference to 
`std::basic_ostream<char, std::char_traits<char> >& 
std::operator<<<std::char_traits<char> >(std::basic_ostream<char, 
std::char_traits<char> >&, char const*)'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe:   
helloworld.cpp:(.text+0x50): undefined reference to `std::cout'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../l/gcc
/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: C:\cygwin64
\tmp\cckThWXU.o: in function 
`__static_initialization_and_destruction_0(int, int)': helloworld.cpp:
(.text+0x88): undefined reference to `std::ios_base::Init::Init()'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: 
helloworld.cpp:(.text+0xb8): undefined reference to 
`std::ios_base::Init::~Init()'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/cross 
gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib/gcc/arm-none-
eabi/10.2.1/../../../../arm-none-eabi/lib\libc.a(lib_a-abort.o): in 
function `abort': abort.c:(.text.abort+0x10): undefined reference to 
`_exit'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/cross 
gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib/gcc/arm-none-
eabi/10.2.1/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): in 
function `_kill_r': signalr.c:(.text._kill_r+0x1c): undefined reference 
to `_kill'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/cross 
gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib/gcc/arm-none-
eabi/10.2.1/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): in 
function `_getpid_r': signalr.c:(.text._getpid_r+0x4): undefined 
reference to `_getpid'
c:/cross gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib
/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: c:/cross 
gcc/gnu arm embedded toolchain/10 2020-q4-major/bin/../lib/gcc/arm-none-
eabi/10.2.1/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): in 
function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to