SuSE缺失devel包的问题

背景

最近几天计划将原Python项目迁移到Liunx服务器上,操作系统是SuSE 12 SP3。原以为Python项目迁移会比较方面,使用pip安装requirements包就好了,结果遇到不少问题。

问题

  • 安装mysqlclient包时,出现了如下报错:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    creating build/temp.linux-x86_64-2.7
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Dversion_info=(1,3,9,'final',1) -D__version__=1.3.9 -I/usr/include/mysql -I/usr/local/python/include/python2.7 -c _mysql.c -o build/temp.linux-x86_64-2.7/_mysql.o -m64
    _mysql.c:29:23: fatal error: my_config.h: No such file or directory
    #include "my_config.h"
    ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

    ----------------------------------------
    Command "/home/sysop/webapp/hzinfo/venv/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-4FRt1w/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-AgHBn8/install-record.txt --single-version-externally-managed --compile --install-headers /home/sysop/webapp/hzinfo/venv/include/site/python2.7/mysqlclient" failed with error code 1 in /tmp/pip-install-4FRt1w/mysqlclient/
  • 安装ldap库时,出现了如下报错:

    1
    2
    3
    4
    5
    6
    In file included from Modules/LDAPObject.c:9:0:
    Modules/errors.h:8:18: fatal error: lber.h: No such file or directory
    #include "lber.h"
    ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

思路

这些错乍看不一样,其实差不多,都是缺失了一些东西,导致安装失败。针对每个问题逐个谷歌百度就会发现,大家会告诉你需要安装对应的开发库及xxx-dev(el)包。

比如上面第一个问题里,安装mysqlclient包报错了,需要安装对应的dev包,在SuSE中是libmysqlclient-devel

xxx与xxx-dev(el)的关系

经过这两天的查询和总结,再Liunx中,一般会把软件拆分为两部分,一部分是直接使用的库即xxx,另一部分就是开发用的库,包含一些头文件之类的,就是xx-dev(el)

差不多可以这样理解:当你只是使用某个软件的时候,你只要安装xxx即可,但当你需要二次开发或者使用对应的一些插件的时候,很可能你就会需要再安装xxx-dev(el)了。

https://blog.csdn.net/wangeen/article/details/14522227

解决办法

知道了问题的原因,那么解决办法就简单了。但是对于SuSE,尤其是没有外网的SuSE就不是了。

SuSE是收费的系统,没办法直接下载到对应的rpm安装包,需要挂载对应系统版本的SDK光盘。而问题是不断暴露和修复的,我们需要的dev包可能在最初获取的SDK光盘里不存在。查看了SuSE官网,有些补丁也是建议通过网络更新的,或者直接下载更新SDK安装盘。

https://www.suse.com/zh-cn/documentation/sles-12/book_sle_deployment/data/sec_add-ons_sdk.html

不过官网下载是相当的慢。。。

zypper的使用

zypper是SuSE的当我们有了对应的sdk光盘或者目录之后,可以通过nfs的方式挂载到zypper源中。

  • 添加源

    1
    2
    3
    zypper ar -t yast2 -n 'sles12sp3_sdk1' -fc nfs://122.16.125.112/iso/sles12sp3_sdk1 sles12sp3_sdk1
    zypper ar -t yast2 -n 'sles12sp3_sdk2' -fc nfs://122.64.29.85/approot1/sles12sp3_sdk sles12sp3_sdk2
    zypper ar -t yast2 -n 'sles12sp3_server' -fc fs://122.64.29.85/approot1/sles12sp3_server sles12sp3_server
  • 搜索需要的安装包

    当遇到上述问题中的安装失败,使用如下的命令搜索下有哪些包可以安装:

    1
    zypper se mysql

    显示结果如下:

    zypper_mysql

  • 安装对应的包

    这里可以看到libmysqlclient-devel没有安装(前面有i标记的即为已经安装),安装即可。

    1
    ~ # zypper install libmysqlclient-devel
  • 搜索安装其他devel包

    同理,在第二个问题中,我们搜索ldap,就会发现可以libldapcpp-devel包没有安装。

    zypper_ldap

    装好之后继续安装python-ldap还会遇到一个错误:

    1
    2
    3
    4
    5
    Modules/LDAPObject.c:18:18: fatal error: sasl.h: No such file or directory
    #include <sasl.h>
    ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

    同理,再搜一下:

    zypper_sasl

    发现cyrus-sasl-devel包没装,也把装上,问题就解决了。

注意

python也是有python-devel包的,这个不要忘了。