我对编译C有一些基本的知识,但需要回答一些通用的交叉编译问题。在我的例子中,我试图在我的Fedora Linux盒上交叉编译一个程序,该程序将在ARM单板计算机上运行。
谢谢你的帮助。
发布于 2010-11-08 00:29:49
fakeroot可以帮助脏的构建系统。发布于 2010-11-08 00:28:28
您打算使用的任何库,包括libc,都必须为目标平台构建,然后才能链接到它。使用目标标头而不是主机头来构建,这样就可以确保您使用正确的API。
发布于 2020-03-10 16:09:41
如果您控制了这两个编译器中的包含路径和工具链,则需要确保为每个正在为其编译的系统都有一个特定于平台的实现。通常,嵌入式系统会创建模拟头来实现常用的标头,比如<stdio.h>、<stdlib.h>和<math.h>。然后,平台特定的编译器/设置使用不同的库来编译这些公共标头。因此,使用裸#include <stdio.h>是没有问题的。
如果您可以访问编译器,可以创建独立的包含路径,则可以为每个平台构建单独的库。
如果您和我一样,并且没有直接访问编译器的权限(供应商SDK隐藏它,让它变得很难看),那么您需要创建一个模拟标头,它根据编译时由上游依赖项设置的标记来定义标头。应该有一些由编译器在上游标头中设置的神奇标志,您可以寻找这些标志来确定是否应该为嵌入式系统和主机系统创建一个标头,例如#if defined(__TMS320C6X__) && defined(__TI_EABI__)来帮助区分。您可以在嵌入式库(包括文件)中挖掘以获得一个示例(stddef.h通常是一个很好的参考)。对于嵌入式系统,使用具有唯一名称(如#define _MyHeader_H )的头保护来标记已定义的标头。最后,您可以执行#ifndef _MyHeader_H来创建主机系统头作为后备情况。
考虑需要<complex.h>的情况,它是为嵌入式系统定义的,而不是为主机系统定义的。
您将有3个头文件:一个用于消除跨编译歧义的虚拟头文件、一个嵌入式系统实现和一个主机实现。
complex_choice.h
#if __STDC_VERSION__ >= 199901L
#include <complex.h>
#endif //using a C99 compiler
#include <complex_host.h> // ! using a C99 compilercomplex.H
#ifndef _COMPLEX_H
#define _COMPLEX_H
//Embedded system implmentation here
#endif /* _COMPLEX_H */Complex_host.H
#ifndef _COMPLEX_H
#define _COMPLEX_H
//Host system implmentation here
#endif /* _COMPLEX_H */https://stackoverflow.com/questions/4120477
复制相似问题