C Linux上的交叉构建第三方库位置
我一直在交叉编译我的单元测试,以确保它们通过所有感兴趣的平台,例如x86 linux、win32、win64和arm linux 单元测试需要CUnit库 因此,我必须为每个平台交叉编译它 它有自己的autoconf功能,因此您可以通过指定--host for configure轻松地交叉构建它 我的问题是,为各种平台安装CUnit LIB的“正确”位置在哪里?i、 e.我应该为配置设置什么--prefix 我最初的猜测是:C Linux上的交叉构建第三方库位置,c,linux,cross-platform,shared-libraries,C,Linux,Cross Platform,Shared Libraries,我一直在交叉编译我的单元测试,以确保它们通过所有感兴趣的平台,例如x86 linux、win32、win64和arm linux 单元测试需要CUnit库 因此,我必须为每个平台交叉编译它 它有自己的autoconf功能,因此您可以通过指定--host for configure轻松地交叉构建它 我的问题是,为各种平台安装CUnit LIB的“正确”位置在哪里?i、 e.我应该为配置设置什么--prefix 我最初的猜测是: /usr/local/<platform>/lib/Cun
/usr/local/<platform>/lib/Cunit
显然,如果我没有为configure指定前缀,那么每个平台构建都会覆盖上一个,这是不好的
为了成功地链接到这些特定于平台的lib,我需要在Makefile中为每个目标在其自己的LDFLAGS中指定相关的lib dir
这是正确的方法吗?我的目录结构/位置是否适合这种交叉构建的东西?我想一定有一个实际的方法,但不确定是什么
也许他应该为我处理所有这些事情?也许我只需要正确设置--target
,或者--enable multilib
?全部带有--前缀=/usr/local
我收到的一些错误MSG建议可能涉及/usr/lib/gcc cross
通过阅读有关交叉编译和Gnu配置和构建系统的更多信息,我似乎应该为配置步骤设置--target选项
但是你怎么知道目标名称是什么呢?它们是交叉编译器名称的某些片段吗
我使用的3个交叉编译器是:
arm-linux-gnueabihf-gcc-4.8
i686-w64-mingw32-gcc
x86_64-w64-mingw32-gcc
允许我交叉编译ARM、win32和win64
我的主机是32位ubuntu,我想可能是——主机是i386 linux,但似乎configure应该正确地将其作为其默认主机这是我最终想出并开始工作的过程: 对于我的3个交叉构建工具(arm、win32、win64)中的每一个,我对配置的调用如下所示:
./configure --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu --prefix=/usr/local/arm-linux-gnueabihf
./configure --host=i686-w64-mingw32 --build=i686-pc-linux-gnu --prefix=/usr/local/i686-w64-mingw32
./configure --host=x86_64-w64-mingw32 --build=i686-pc-linux-gnu --prefix=/usr/local/x86_64-w64-mingw32
每一个之后是make
,sudomake安装
在为arm交叉构建调用configure之前,我必须执行以下操作:
ln -s /usr/bin/arm-linux-gnueabihf-gcc-4.8 /usr/bin/arm-linux-gnueabihf-gcc
这是因为编译器的末尾标记了-4.8
,因此configure无法正确地“猜测”编译器的名称
此问题不适用于win32或win32 mingw编译器
注意,另一个问题是,当随后尝试链接到这些交叉编译的CUnit LIB时,默认情况下没有任何交叉编译器在/usr/local/include中查找,因此我必须手动添加:
-I/usr/local/include
对于每个对象文件生成
e、 g.我将/usr/local/include
添加到我的Makefile中的include\u DIRS
所有这些似乎最终给了我正确的交叉构建的CUnit libs,我已经成功地链接到它们,为每个目标平台生成交叉构建的单元测试二进制文件
一点也不容易,我冒昧地将配置选项设置称为“反直觉”——就像以往一样,花时间阅读相关文档是值得的——这段代码很有针对性:
构建知道三个系统名称:机器
您正在构建(build),您为之构建的机器
(主机),以及GCC将为其生成代码的机器(目标)。什么时候
配置GCC时,使用--build=,--host=,和
--目标=
应避免在不指定生成的情况下指定主机,如下所示:
configure可能(并且曾经)假设您指定的主机也是
构建,这可能不是真的
如果构建、主机和目标都相同,则称为本机。
如果构建和主机相同,但目标不同,则称为
十字架。如果构建、主机和目标都不同,则称为
加拿大人(因与加拿大政党打交道的不明原因)
以及当时负责构建的人员的背景)。
如果主机和目标相同,但构建不同,则使用
为不同系统构建本机的交叉编译器。一些人
将其称为主机x主机、交叉本机或交叉构建本机
而且:
当人们配置像“./configure”这样的项目时,人们经常会遇到
这三个令人困惑的选项与
交叉编译
--host: In which system the generated program will run.
--build: In which system the program will be built.
--target: this option is only used to build a cross-compiling
toolchain. When the tool chain generates executable program, in which target
system the program will run.
tslib(鼠标驱动程序库)示例
“./configure--host=arm-linux--build=i686 pc-linux-gnu”:
动态库构建在x86 linux计算机上,但将使用
对于嵌入式arm linux系统
正确的位置是编译器的前缀。配置CUnit时,应将
--prefix=/usr/local/PLATFORM
传递给configure。您为armlinux gnueabihf
目标显示的目录似乎是正确的。编译器应该在PREFIX/include
和PREFIX/lib
中自动查找include和lib,而不设置CFLAGS和LDFLAGS。那么问题是什么呢?您看到了什么错误消息?这很有用,它会提示我的初始方法--prefix是正确的。奇怪的是,当我设置--target arm linux gnueabihf时,后面的make不使用arm编译器,但是如果我指定--host arm linux gnueabihf,那么它确实使用arm编译器。这似乎是错误的方法,因为meSohost
是我构建和编译的机器吗?
--host: In which system the generated program will run.
--build: In which system the program will be built.
--target: this option is only used to build a cross-compiling
toolchain. When the tool chain generates executable program, in which target
system the program will run.