在Linux上交叉构建第三方库位置

时间:2014-11-28 11:54:48

标签: c linux cross-platform shared-libraries

我一直在交叉编译我的单元测试,以确保它们传递所有感兴趣的平台,例如: x86-linux,win32,win64,arm-linux

他们的单元测试需要CUnit库

所以我不得不为每个平台交叉编译

它带有自己的autoconf内容,因此您可以通过指定--host for configure

轻松地交叉构建它

我遇到的问题是在各种平台上安装CUnit库的“正确”位置在哪里?即我应该设置--prefix to for configure?

我最初的猜测是:

/usr/local/<platform>/lib/Cunit

即。设置--prefix /usr/local/<platform>

e.g。 --prefix /usr/local/arm-linux-gnueabihf

sudo make install上为您提供:

/usr/local/arm-linux-gnueabihf/doc/CUnit
/usr/local/arm-linux-gnueabihf/include/CUnit
/usr/local/arm-linux-gnueabihf/lib
/usr/local/arm-linux-gnueabihf/share/CUnit

显然,如果我没有为configure指定前缀,那么每个平台构建都会覆盖那个不合适的prev

然后成功链接到这些特定于平台的库我需要在Makefile中为自己的LDFLAGS中的每个目标指定相关的lib目录

这是正确的做法吗?我是否拥有适合这种交叉构建的dir结构/位置?我认为必须有一个事实上的方法,但不确定它是什么..

可能配置应该为我处理所有这些东西?也许我只需要正确设置--target,也许--enable-multilib?全部都是--prefix=/usr/local

我建议/usr/lib/gcc-cross可能涉及的一些错误消息?

从阅读有关交叉编译和Gnu配置和构建系统的更多内容看来,我应该只为配置步骤设置--target选项

但你怎么知道目标名称是什么?它们是交叉编译器名称的一些片段吗?

我使用的3个交叉编译器是:

臂-Linux的gnueabihf-GCC-4.8 i686的-W64-的mingw32-GCC x86_64的-W64-的mingw32-GCC

允许我为ARM,win32和win64交叉编译

我的主机是32位ubuntu,我认为可能是--host i386-linux,但似乎配置应该是正确的默认

1 个答案:

答案 0 :(得分:1)

这是我最终想出并开始工作的程序:

对于我的3个交叉构建工具(arm,win32,win64)中的每一个,我对configure的调用看起来像:

./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

其中每个都跟着makesudo make install

在为arm交叉构建调用configure之前我必须这样做:

ln -s /usr/bin/arm-linux-gnueabihf-gcc-4.8 /usr/bin/arm-linux-gnueabihf-gcc

这是因为编译器在末尾标记了-4.8,因此configure无法正确“猜测”编译器的名称

此问题不适用于win32或win64 mingw编译器

注意另外一个问题是,当后来尝试链接到这些交叉编译的CUnit库时,没有任何交叉编译器默认情况下会查找/ usr / local / include,因此我不得不手动添加:

-I/usr/local/include 

为每个目标文件构建

e.g。我在我的Makefile

中添加了/usr/local/includeINCLUDE_DIRS 所有这些似乎最终给了我正确的交叉构建的CUnit库,并且我已成功链接到它们以为每个目标平台生成交叉构建的单元测试二进制文件。

一点也不容易,我冒昧地将配置选项设置称为“反直觉” - 一如既往值得花时间阅读相关文档 - 这个片段是相关的:

  

构建知道有三个系统名称:机器   你正在构建(build),你正在构建的机器   (主机),GCC将为(目标)生成代码的机器。什么时候   您配置GCC,您可以使用--build =, - host =和指定它们   --target =

     

应避免指定主机而不指定构建,如   configure may(和曾经做过的)假设您指定的主机也是   构建,可能不是真的。

     

如果构建,主机和目标都相同,则称为本机。   如果构建和主机相同但目标不同,则调用此方法   一个十字架。如果构建,主机和目标都不同,则称为a   加拿大(出于与加拿大政党打交道的不明原因)   和那个时候从事建筑工作的人的背景)。   如果主机和目标相同,但构建不同,则表示您正在使用   用于为不同系统构建本机的交叉编译器。有些人   称之为host-x-host,cross native或cross-built native。

还有:

  

当人们配置像'./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':the   动态库是在x86 linux计算机上构建的,但将被使用   对于嵌入式arm linux系统。