当我为 arm 构建一个 protobuff 然后安装它时,我在 lib/目录中看不到*.so
文件,只有*.a
和*.la
。如果我为 x86 构建它,那么一切都很好。
命令顺序如下:
sudo ./configure --host=amd64 --build=arm-linux-gnueabihf --target=arm-linux-gnueabihf --enable-shared --prefix=/home/rivand/install/tmp CC=/usr/bin/arm-linux-gnueabihf-gcc CXX=/usr/bin/arm-linux-gnueabihf-g++
sudo make -j4
sudo make install
Protobuf: protobuf-cpp-3.14.0
操作系统: 乌班图 20.04
make
和GCC
从apt install
.
你混淆了--host
、--build
和--target
。--host
选项指定将在其上运行要生成的项目的计算机类型。--build
选项指定要在其上执行生成的计算机类型,通常不需要指定它,因为生成系统可以猜测。事实上,这就是辅助脚本config.guess
的全部目的,它应该包含在protobuf发行版中。 仅当您正在构建的东西本身是交叉工具时,--target
选项才适用;它为构建的工具本身使用的二进制文件指定计算机类型。
正确设置这些后,您可能不需要显式指定 C 和 C++ 编译器 -configure
应该从主机三元组中找出它们。 (宿主三元组出现在交叉工具的名称中并非巧合。
此外,在安装时使用DESTDIR
在语义上比在configure
时使用--prefix
更正确。 它也可能产生真正的差异,因为指定的前缀有时会编译到构建的二进制文件中。
此外,作为旁注,仅在安装步骤中使用sudo
,而不是配置和构建步骤。 这样更安全,并且不会在构建目录中留下根拥有的碎片。 但是,如果您正在安装到具有写入权限的目录中,则不需要它,就像您在示例命令中所做的那样。
因此:
./configure --host=arm-linux-gnueabihf --enable-shared
make -j4
make install DESTDIR=/home/rivand/install/tmp
在安装步骤中,您可能会收到来自 libtool 的一些警告,建议您在最终将结果放在其真实安装位置时运行其他 libtool 命令。 通常忽略Linux上的那些是安全的。
我不完全相信这会让你共享库,因为这部分是你正在构建的项目的功能,部分也是跨工具链功能的功能。 但它会让你正确构建工具,并且它很有可能生成想要的共享库。