Google 协议缓冲区。 'make install' protobuf building to cross-arm 时不生成so文件

Google protocol buffers. 'make install' does not generate so files when protobuf building to cross-arm

当我为 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

OS: Ubuntu 20.04

makeGCC 来自 apt install.

您混淆了 --host--build--target--host 选项指定您正在构建的工件将在其上运行 的机器类型。 --build 选项指定您正在执行构建的机器类型,您通常不需要指定它,因为构建系统可以猜测。事实上,这就是辅助脚本 config.guess 的全部目的,它应该包含在 protobuf 分发中。 --target 选项仅适用于您正在构建的东西本身就是一个交叉工具;它指定构建工具本身使用的二进制文件的机器类型。

正确设置这些后,您可能不需要明确指定 C 和 C++ 编译器——configure 应该从主机三元组中找出它们。 (交叉工具名称中宿主三元组的出现并非巧合。)

此外,在安装时使用 DESTDIR 比在 configure 时使用 --prefix 在语义上更正确。它也可能会产生真正的不同,因为指定的前缀有时会编译到内置的二进制文件中。

此外,作为旁注,仅在安装步骤使用 sudo,而不是配置和构建步骤。这样更安全,并且不会在构建目录中留下 root 拥有的碎片。但是即使你安装到你有写权限的目录中,你也不需要它,就像你在示例命令中所做的那样。

因此:

./configure --host=arm-linux-gnueabihf --enable-shared
make -j4
make install DESTDIR=/home/rivand/install/tmp

您可能会在安装步骤中收到来自 libtool 的一些警告,当您最终将结果放置在其真正的安装位置时,会向 运行 推荐额外的 libtool 命令。忽略 Linux.

上的那些通常是安全的

我不完全相信这会让您获得共享库,因为这部分是您正在构建的项目的一个功能,部分也是您的交叉工具链功能的一个功能。但它将为您提供正确构建的工具,并且很有可能生成所需的共享库。