首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C的交叉编译要求

问C的交叉编译要求
EN

Stack Overflow用户
提问于 2010-11-08 00:24:48
回答 3查看 2.1K关注 0票数 9

我对编译C有一些基本的知识,但需要回答一些通用的交叉编译问题。在我的例子中,我试图在我的Fedora Linux盒上交叉编译一个程序,该程序将在ARM单板计算机上运行。

  1. 我的第一个问题是关于标题的。我已经下载了arm Linux工具包,它在包含目录中包含头文件,如stdio.h。当我交叉编译时,我应该使用这个“目标”包含目录而不是我的系统包含目录吗?或者可以指向我的系统的include (如/usr/include )?(当我对头文件进行区分时,这些头文件似乎是不同的。)
  2. 如果头文件不存在会发生什么。在我的例子中,我还计划利用ARM板上的cURL库。我是否可以简单地指向我下载的curl源代码包中包含的目录,而不必担心目标体系结构?如果是,这是否意味着我的第一个问题无关紧要?
  3. ,假设我想静态地链接到一个库。在发生这种情况之前,需要为目标ARM平台编译这个静态库吗?或者我可以直接使用安装在我的系统上的静态库(希望交叉编译过程能够处理业务)?
  4. 如果我决定动态链接到一个库,唯一的要求是目标系统将这个库编译为ARM并安装在ARM板上的一个LD_LIBRARY_PATH目录中,对吗?

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-08 00:29:49

  1. 总是使用目标标头。它们可能与您的主机标题不同。编译器应该已经将它们作为标准问题的默认包含路径的一部分,例如libc.
  2. ,您需要使用交叉编译器将cURL构建为假的“目标”系统目录,并在此目标目录中使用cURL构建应用程序。由于您还需要一个cURL库,所以必须使用交叉编译器。对于不是交叉编译友好的编译(例如构建程序并作为编译的一部分运行),您将需要修改构建过程。有时,fakeroot可以帮助脏的构建系统。
  3. 您不能任意地使用静态库来处理与系统不同的体系结构。它们必须由交叉compiler.
  4. Incorrect.建造库通常必须存在。
票数 10
EN

Stack Overflow用户

发布于 2010-11-08 00:28:28

您打算使用的任何库,包括libc,都必须为目标平台构建,然后才能链接到它。使用目标标头而不是主机头来构建,这样就可以确保您使用正确的API。

票数 3
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
#if __STDC_VERSION__ >= 199901L
#include <complex.h>
#endif //using a C99 compiler
#include <complex_host.h>  // ! using a C99 compiler

complex.H

代码语言:javascript
复制
#ifndef _COMPLEX_H
#define _COMPLEX_H
//Embedded system implmentation here
#endif /* _COMPLEX_H */

Complex_host.H

代码语言:javascript
复制
#ifndef _COMPLEX_H
#define _COMPLEX_H
//Host system implmentation here
#endif /* _COMPLEX_H */
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4120477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档