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
make
和 GCC
来自 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.
上的那些通常是安全的
我不完全相信这会让您获得共享库,因为这部分是您正在构建的项目的一个功能,部分也是您的交叉工具链功能的一个功能。但它将为您提供正确构建的工具,并且很有可能生成所需的共享库。
当我为 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
make
和 GCC
来自 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.
上的那些通常是安全的我不完全相信这会让您获得共享库,因为这部分是您正在构建的项目的一个功能,部分也是您的交叉工具链功能的一个功能。但它将为您提供正确构建的工具,并且很有可能生成所需的共享库。