Alpine Linux下Libjpeg-9d加--disable-shared仍生成.so文件问题咨询
问题根因
libjpeg-9d的configure脚本存在兼容性bug,在musl libc环境下无法正确识别--disable-shared参数,即使显式关闭动态库生成,编译脚本仍会默认生成.so动态库文件。
可行解决方案
方案1:手动修改编译生成的Makefile(适配原有编译流程)
操作步骤如下:
- 首先正常执行configure配置:
./configure --disable-shared
- 打开当前目录下生成的Makefile文件,修改两个配置项:
- 找到
SHAREDLIBS = libjpeg.so.9.5.0 libjpeg.so.9 libjpeg.so的行,将值改为空:SHAREDLIBS = - 找到
INSTALL_SHARED = ${SHELL} ./libtool --mode=install $(INSTALL_PROGRAM)的行,将值改为空:INSTALL_SHARED =
- 找到
- 后续正常执行编译安装即可:
make && make install
完成后/usr/local/lib目录下只会生成libjpeg.a静态库文件。
方案2:跳过make install手动部署(最稳妥)
不需要修改任何编译配置,编译完成后手动拷贝所需文件即可:
- 执行配置和编译步骤:
./configure --disable-shared && make -j$(nproc)
- 手动拷贝静态库到系统库目录:
cp .libs/libjpeg.a /usr/local/lib/
- 拷贝对应头文件到系统头目录:
cp jpeglib.h jerror.h jconfig.h jmorecfg.h /usr/local/include/
该方案完全避开了编译脚本的install逻辑,不会产生多余的动态库文件。
方案3:编译时强制指定静态编译参数
执行configure时额外传入静态编译标记,覆盖脚本的错误逻辑:
./configure --enable-static --disable-shared LDFLAGS="-static" make && make install
该方案在大部分musl环境下可以直接触发正确的静态库唯一生成逻辑,不需要修改配置文件。
验证方法
安装完成后执行以下命令确认仅生成静态库:
ls /usr/local/lib/libjpeg*
输出仅包含/usr/local/lib/libjpeg.a即为符合预期。
内容的提问来源于stack exchange,提问作者Петр Петров
相关产品推荐
相关产品推荐

