使用 musl 构建 MariaDB:/usr/bin/ld 找不到 -lgcc_s
Building MariaDB with musl: /usr/bin/ld cannot find -lgcc_s
我正在尝试 build MariaDB v10.3 with a musl x86_64 Debian 内核 v4.19 上的工具链。我主要使用 musl-gcc
gcc
包装器来实现这一点。我安装的相关包如下:
musl
(1.1.21-2): 标准 C 库
musl-dev
(1.1.21-2): 标准C库开发文件
musl-tools
(1.1.21-2): 标准 C 库工具
要构建 MariaDB,我首先 运行:
CC=/usr/bin/musl-gcc cmake ../ -DWITHOUT_TOKUDB=1
它干净地退出,然后我跟进:
make CC=/usr/bin/musl-gcc
错误信息如下:
Scanning dependencies of target strings-t
[ 12%] Building C object unittest/strings/CMakeFiles/strings-t.dir/strings-t.c.o
[ 12%] Linking CXX executable strings-t
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
make[2]: *** [unittest/strings/CMakeFiles/strings-t.dir/build.make:94: unittest/strings/strings-t] Error 1
make[1]: *** [CMakeFiles/Makefile2:731: unittest/strings/CMakeFiles/strings-t.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
现在我知道 musl 正在寻找的库 (libgcc_s.so
) 位于 /lib/gcc/x86_64-linux-gnu/8/
但我尝试使用 LDFLAGS
包含库或将库符号链接到 /usr/lib/x86_64-linux-musl/
失败了。
我打算以正确的方式编译 MariaDB 吗?我想我做错了什么,因为 Alpine Linux 可以 运行 它。
那么为什么不看看 alpine 是如何构建它的呢?
他们似乎禁用了测试
-DSKIP_TESTS=ON
参考:https://git.alpinelinux.org/aports/tree/main/mariadb/APKBUILD?id=3ca8e70b047f37a01df42e3244014a6635893abc#n186
他们的 ppc-glibc 补丁?
https://git.alpinelinux.org/aports/tree/main/mariadb/ppc-remove-glibc-dep.patch?id=3ca8e70b047f37a01df42e3244014a6635893abc
当我完全成功时我会更新这个答案,但到目前为止的解决方案是使用 musl-cross-make 编译所有库等专门针对 musl。自从获得 musl-cross-make 以来,我一直在从头开始构建所有依赖项(这并不好玩 :))。到目前为止,我已经或多或少地获得了成功的配置,并且我正在进行编译(敲定最后几个依赖项)。
我正在使用以下脚本来构建东西:
#!/bin/bash
set -euo pipefail
# musl paths
MUSL_PREFIX='/usr/local/x86_64-linux-musl'
MUSL_INC="$MUSL_PREFIX/include"
MUSL_LIB="$MUSL_PREFIX/lib"
CC='/usr/local/bin/x86_64-linux-musl-gcc'
CXX='/usr/local/bin/x86_64-linux-musl-g++'
#
# CMake couldn't locate lz4 when I installed it manually, so we bundle
# it in with the MariaDB build
#
wget https://github.com/lz4/lz4/archive/v1.7.5.tar.gz
tar -xzf v1.7.5.tar.gz
rm v1.7.5.tar.gz
mv lz4-1.7.5 /home/ajg/mariadb/storage/mroonga/vendor/groonga/vendor/
# Configure the build
CC="$CC" \
CXX="$CXX" \
LDFLAGS="-L$MUSL_LIB -Wl,-rpath,$MUSL_LIB" \
CFLAGS="-I$MUSL_INC" \
CXXFLAGS="-I$MUSL_INC" \
CPPFLAGS="-I$MUSL_INC" \
CMAKE_PREFIX_PATH="$MUSL_PREFIX" \
cmake . -DWITHOUT_TOKUDB=1 -DGRN_WITH_BUNDLED_LZ4=ON
# Make it
make \
CC="$CC" \
CXX="$CXX" \
LDFLAGS="-L$MUSL_LIB -Wl,-rpath,$MUSL_LIB" \
CFLAGS="-I$MUSL_INC" \
CXXFLAGS="-I$MUSL_INC" \
CPPFLAGS="-I$MUSL_INC"
我希望这对以后的其他人有所帮助:)
我正在尝试 build MariaDB v10.3 with a musl x86_64 Debian 内核 v4.19 上的工具链。我主要使用 musl-gcc
gcc
包装器来实现这一点。我安装的相关包如下:
musl
(1.1.21-2): 标准 C 库musl-dev
(1.1.21-2): 标准C库开发文件musl-tools
(1.1.21-2): 标准 C 库工具
要构建 MariaDB,我首先 运行:
CC=/usr/bin/musl-gcc cmake ../ -DWITHOUT_TOKUDB=1
它干净地退出,然后我跟进:
make CC=/usr/bin/musl-gcc
错误信息如下:
Scanning dependencies of target strings-t
[ 12%] Building C object unittest/strings/CMakeFiles/strings-t.dir/strings-t.c.o
[ 12%] Linking CXX executable strings-t
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
make[2]: *** [unittest/strings/CMakeFiles/strings-t.dir/build.make:94: unittest/strings/strings-t] Error 1
make[1]: *** [CMakeFiles/Makefile2:731: unittest/strings/CMakeFiles/strings-t.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
现在我知道 musl 正在寻找的库 (libgcc_s.so
) 位于 /lib/gcc/x86_64-linux-gnu/8/
但我尝试使用 LDFLAGS
包含库或将库符号链接到 /usr/lib/x86_64-linux-musl/
失败了。
我打算以正确的方式编译 MariaDB 吗?我想我做错了什么,因为 Alpine Linux 可以 运行 它。
那么为什么不看看 alpine 是如何构建它的呢?
他们似乎禁用了测试
-DSKIP_TESTS=ON
参考:https://git.alpinelinux.org/aports/tree/main/mariadb/APKBUILD?id=3ca8e70b047f37a01df42e3244014a6635893abc#n186
他们的 ppc-glibc 补丁? https://git.alpinelinux.org/aports/tree/main/mariadb/ppc-remove-glibc-dep.patch?id=3ca8e70b047f37a01df42e3244014a6635893abc
当我完全成功时我会更新这个答案,但到目前为止的解决方案是使用 musl-cross-make 编译所有库等专门针对 musl。自从获得 musl-cross-make 以来,我一直在从头开始构建所有依赖项(这并不好玩 :))。到目前为止,我已经或多或少地获得了成功的配置,并且我正在进行编译(敲定最后几个依赖项)。
我正在使用以下脚本来构建东西:
#!/bin/bash
set -euo pipefail
# musl paths
MUSL_PREFIX='/usr/local/x86_64-linux-musl'
MUSL_INC="$MUSL_PREFIX/include"
MUSL_LIB="$MUSL_PREFIX/lib"
CC='/usr/local/bin/x86_64-linux-musl-gcc'
CXX='/usr/local/bin/x86_64-linux-musl-g++'
#
# CMake couldn't locate lz4 when I installed it manually, so we bundle
# it in with the MariaDB build
#
wget https://github.com/lz4/lz4/archive/v1.7.5.tar.gz
tar -xzf v1.7.5.tar.gz
rm v1.7.5.tar.gz
mv lz4-1.7.5 /home/ajg/mariadb/storage/mroonga/vendor/groonga/vendor/
# Configure the build
CC="$CC" \
CXX="$CXX" \
LDFLAGS="-L$MUSL_LIB -Wl,-rpath,$MUSL_LIB" \
CFLAGS="-I$MUSL_INC" \
CXXFLAGS="-I$MUSL_INC" \
CPPFLAGS="-I$MUSL_INC" \
CMAKE_PREFIX_PATH="$MUSL_PREFIX" \
cmake . -DWITHOUT_TOKUDB=1 -DGRN_WITH_BUNDLED_LZ4=ON
# Make it
make \
CC="$CC" \
CXX="$CXX" \
LDFLAGS="-L$MUSL_LIB -Wl,-rpath,$MUSL_LIB" \
CFLAGS="-I$MUSL_INC" \
CXXFLAGS="-I$MUSL_INC" \
CPPFLAGS="-I$MUSL_INC"
我希望这对以后的其他人有所帮助:)