我正在尝试交叉编译一个项目和它依赖的库,以便在嵌入式系统上使用。应用程序和依赖项都使用automake。我能够在没有太多问题的情况下编译库。
./configure --host=powerpc-none-linux-gnuspe --prefix=/home/me/build_dir
make
make install
我使用了--prefix
,因此make install
没有将输出放在我的文件系统中,包含所有x86库。我还尝试在没有--prefix
的情况下运行configure,而是在运行DESTDIR
之前设置make install
环境变量。他们似乎做了同样的事情。我希望能够将/home/me/build_dir
置于tar并将其放在嵌入式目标文件系统的根目录下。我希望--prefix
没有硬编码我主机上的绝对路径。
然后我尝试交叉编译使用此库的应用程序:
./configure --host=powerpc-none-linux-gnuspe --with-sysroot=/home/me/build_dir
我遇到了两件事。配置脚本已成功完成,但第一个make失败,因为它无法找到其中一个标头。它位于/usr/include
而不是/home/be/build_dir/usr/include
下。 --with-sysroot
选项不应该修改包含目录,还是我遗漏了什么?
另外,我收到了警告
libtool: link: warning: library libstdc++.la was moved
我觉得我错过了什么。这个警告是我可以放心忽略的,还是我搞砸了?
总结我的问题:
1)./configure --prefix=x
和make DESTDIR=x install
之间是否存在差异?
2)更新库标题的搜索路径的正确方法是什么?
3)为什么我收到有关libstdc ++的警告,这是我应该担心的事情吗?
答案 0 :(得分:4)
根据您的情况,您应该使用DESTDIR
。设置--prefix
意味着生成的程序将安装在--prefix
中的位置。另一方面,DESTDIR
是纯粹的make install工件,它在安装时只是前缀到每个路径的开头。生成的产品仍然希望安装在--prefix
位置。如果您要在目标主机上安装结果,请将--prefix
设置为它将去的位置,并使用DESTDIR
将其暂存到其他位置。
我认为仅在--sysroot
脚本中设置configure
是不够的,但我不确定。我认为在configure
运行时设置sysroot但它没有设置makefile。
我通常做的是为编译器创建一个shell脚本包装器,它使用正确的--sysroot=dir
选项调用实际编译器,然后使用该包装器作为configure
的编译器名称。这样做更简单,而不是试图让编译器的所有调用都在外部添加--sysroot
标志。
我不确定libstdc++
警告。 libstdc++
是编译器的一部分,不是sysroot的一部分......?
ETA:
通过脚本包装器,我的意思是创建一个名为sysroot-gcc
的脚本:
#!/bin/sh
exec real-gcc --sysroot=/some/sysroot "$@"
然后你可以运行configure CC=sysroot-gcc
。你可以根据自己的喜好来制作这个;我有一个通用脚本解析名称($0
)并从中获取sysroot名称和工具名称(gcc
,g++
等),以便我可以重用那个脚本适用于所有工具。