Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux上的交叉构建第三方库位置_C_Linux_Cross Platform_Shared Libraries - Fatal编程技术网

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

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

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

单元测试需要CUnit库

因此,我必须为每个平台交叉编译它

它有自己的autoconf功能,因此您可以通过指定--host for configure轻松地交叉构建它

我的问题是,为各种平台安装CUnit LIB的“正确”位置在哪里?i、 e.我应该为配置设置什么--prefix

我最初的猜测是:

/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编译器。这似乎是错误的方法,因为meSo
host
是我构建和编译的机器吗?
--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.