freetype-config not found

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
ahwwl
帖子: 1
注册时间: 2019-05-19 18:48
系统: ubuntu19.04

freetype-config not found

#1

帖子 ahwwl » 2019-05-19 18:51

安装PHP7.3.5, gd扩展里面无法添加freetype
./configure --with-php-config=/opt/php7/bin/php-config --with-jpeg-dir --with-freetype-dir=/usr/local/freetype --enable-gd-native-ttf
都是
freetype-config not found
doopsky
帖子: 3
注册时间: 2012-02-08 18:21

Re: freetype-config not found

#2

帖子 doopsky » 2019-05-20 14:26

你好,我在编译安装时也遇到了这个错误。这个错误可能是 在 Ubuntu 19.04 中安装的 libfreetype6-2.9.1-3 https://packages.ubuntu.com/disco/libfreetype6 版本不兼容的问题。我尝试编译安装较旧的 freetype-2.8.1 ,PHP 7.3.5 编译安装成功。

1、先卸载已经通过 apt-get 安装的 libfreetype6 (同时也会移除 libfreetype6-dev 和其他软件包,无影响)

代码: 全选

apt-get remove libfreetype6


2、下载并编译安装旧版本的 freetype,freetype 亦可以在 SourcForge https://sourceforge.net/projects/freety ... pe2/2.8.1/ 上下载。

代码: 全选

cd YOUR_DIR
wget http://download.savannah.gnu.org/releases/freetype/freetype-2.8.1.tar.gz
tar zxvf freetype-2.8.1.tar.gz
cd freetype-2.8.1/
./configure --prefix=YOUR_PREFIX
make && make install
3、第三步很重要 编译安装的 freetype 需要在 include/freetype2 文件夹中建立向上一层的软连接。

代码: 全选

ln -s YOUR_PREFIX/include/freetype2/freetype YOUR_PREFIX/include/freetype
ln -s YOUR_PREFIX/include/freetype2/ft2build.h YOUR_PREFIX/include/ft2build.h
4、最后编译安装 PHP 时请加上 --with-freetype-dir 参数

代码: 全选

--with-freetype-dir=YOUR_PREFIX
希望可以帮到你。
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: freetype-config not found

#3

帖子 astolia » 2019-05-21 10:31

doopsky 写了: 2019-05-20 14:26 你好,我在编译安装时也遇到了这个错误。这个错误可能是 在 Ubuntu 19.04 中安装的 libfreetype6-2.9.1-3 https://packages.ubuntu.com/disco/libfreetype6 版本不兼容的问题。我尝试编译安装较旧的 freetype-2.8.1 ,PHP 7.3.5 编译安装成功。
我觉得你们两个没真正搞懂--with-freetype-dir的作用。它作为编译安装freetype库时指定的--prefix,php的configure会去运行所指定目录下面的bin/freetype-config
对于系统上的freetype库而言,就是/usr。只要安装了libfreetype6-dev,/usr/bin/freetype-config就在那里了
doopsky 写了: 2019-05-20 14:26 3、第三步很重要 编译安装的 freetype 需要在 include/freetype2 文件夹中建立向上一层的软连接。

代码: 全选

ln -s YOUR_PREFIX/include/freetype2/freetype YOUR_PREFIX/include/freetype
ln -s YOUR_PREFIX/include/freetype2/ft2build.h YOUR_PREFIX/include/ft2build.h
没必要,只要freetype-config安装正确,用freetype-config --cflags运行就能得到正确的头文件目录,不需要再建立软链接
doopsky
帖子: 3
注册时间: 2012-02-08 18:21

Re: freetype-config not found

#4

帖子 doopsky » 2019-05-22 5:30

astolia 版主你好,感谢你的认真回复。我也是初级 Ubuntu 使用者,绝大多数问题我自己也是通过 Google 搜索解决,已经通过我自己解决的问题,我也很高兴向大家分享。确实我解决问题的方法很拙劣,在此我也希望通过 Ubuntu 中文社区 向大家多多学习。
astolia 写了: 2019-05-21 10:31
我觉得你们两个没真正搞懂--with-freetype-dir的作用。它作为编译安装freetype库时指定的--prefix,php的configure会去运行所指定目录下面的bin/freetype-config
对于系统上的freetype库而言,就是/usr。只要安装了libfreetype6-dev,/usr/bin/freetype-config就在那里了
首先我先解释一下,我在第二步编译安装 FreeType 时,已经指定了编译安装路径:
doopsky 写了: 2019-05-20 14:26
2、下载并编译安装旧版本的 freetype,freetype 亦可以在 SourcForge https://sourceforge.net/projects/freety ... pe2/2.8.1/ 上下载。

代码: 全选

cd YOUR_DIR
wget http://download.savannah.gnu.org/releases/freetype/freetype-2.8.1.tar.gz
tar zxvf freetype-2.8.1.tar.gz
cd freetype-2.8.1/
./configure --prefix=YOUR_PREFIX
make && make install
YOUR_PREFIX 代在第四步指定 --with-freetype-dir 的路径
doopsky 写了: 2019-05-20 14:26 4、最后编译安装 PHP 时请加上 --with-freetype-dir 参数

代码: 全选

--with-freetype-dir=YOUR_PREFIX
PHP 文档中明确说明 https://www.php.net/manual/zh/image.installation.php ,增强 GD 的文字处理能力,要激活 FreeType 2 的支持,加上 --with-freetype-dir=DIR 。

如果编译安装 FreeType 时,./configure 配置不使用 --prefix ,一般系统默认安装路径为 /usr/local 。这时编译安装 PHP 只需要使用 --with-freetype-dir 就可以。

我是经过测试,在 Ubuntu 19.04 (Disco) 中通过 apt-get 安装的 libfreetype6-dev 确实由于版本问题,导致 PHP 7.3.5 编译安装时出现 freetype-config not found 的问题。

并且我这不是个案:
https://www.bt.cn/bbs/thread-31210-1-1.html
https://oneinstack.com/question/18663/

astolia 写了: 2019-05-21 10:31
doopsky 写了: 2019-05-20 14:26 3、第三步很重要 编译安装的 freetype 需要在 include/freetype2 文件夹中建立向上一层的软连接。

代码: 全选

ln -s YOUR_PREFIX/include/freetype2/freetype YOUR_PREFIX/include/freetype
ln -s YOUR_PREFIX/include/freetype2/ft2build.h YOUR_PREFIX/include/ft2build.h
没必要,只要freetype-config安装正确,用freetype-config --cflags运行就能得到正确的头文件目录,不需要再建立软链接
我亲自测试,不在 /usr/local 中安装 FreeType,会出现错误:

代码: 全选

ft2build.h : No such file or directory.
我是通过这篇文章启发解决的:
https://blog.csdn.net/u012226330/articl ... s/17611749

最后感谢 astolia 版主的回复,希望今后能够向你多多学习。
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: freetype-config not found

#5

帖子 astolia » 2019-05-22 20:35

doopsky 写了: 2019-05-22 5:30 我是经过测试,在 Ubuntu 19.04 (Disco) 中通过 apt-get 安装的 libfreetype6-dev 确实由于版本问题,导致 PHP 7.3.5 编译安装时出现 freetype-config not found 的问题。
确实。这里我弄错了,19.04源里的libfreetype6-dev包里没有freetype-config。changelog http://changelogs.ubuntu.com/changelogs ... /changelog 里提到在2.9.1-1时,
- The `freetype-config' script is no longer installed by default
(Closes: #871470, #886461). All packages depending on libfreetype6-dev
should use pkg-config to find the relevant CFLAGS and libraries.
要解决也很简单,主要思路就是用pkg-config代替freetype-config。pkg-config可能没有预先安装上,需要用sudo apt install pkg-config来安装
比如直接修改php的configure,在34506行有这么一段

代码: 全选

    for i in $PHP_FREETYPE_DIR /usr/local /usr; do
      if test -f "$i/bin/freetype-config"; then
        FREETYPE2_DIR=$i
        FREETYPE2_CONFIG="$i/bin/freetype-config"
        break
      fi
    done

    if test -z "$FREETYPE2_DIR"; then
      as_fn_error $? "freetype-config not found." "$LINENO" 5
    fi

    FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags`
    FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs`
把用到freetype-config的地方全部用pkg-config以正确方式替换掉就行了。

代码: 全选

    for i in $PHP_FREETYPE_DIR /usr/local /usr; do
      if test -f "$i/bin/pkg-config"; then
        FREETYPE2_DIR=$i
        FREETYPE2_CONFIG="$i/bin/pkg-config"
        break
      fi
    done

    if test -z "$FREETYPE2_DIR"; then
      as_fn_error $? "freetype-config not found." "$LINENO" 5
    fi

    FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG freetype2 --cflags`
    FREETYPE2_LIBS=`$FREETYPE2_CONFIG freetype2 --libs`
再用./configure --with-freetype-dir=/usr .... 这样编译就可以了

doopsky 写了: 2019-05-22 5:30 我亲自测试,不在 /usr/local 中安装 FreeType,会出现错误:

代码: 全选

ft2build.h : No such file or directory.
从编译时头文件查找的原理来看,只要在编译freetype进行configure这步时设定的--prefix和最后安装的位置一致,php的--with-freetype-dir也一致,就不可能出这个问题。所以肯定你哪里弄错了。

doopsky 写了: 2019-05-20 14:26 1、先卸载已经通过 apt-get 安装的 libfreetype6 (同时也会移除 libfreetype6-dev 和其他软件包,无影响)

代码: 全选

apt-get remove libfreetype6
你这点我是最不认同的,如果安装的是ubuntu桌面版,卸载掉libfreetype6的话,整个图形环境都会被卸载掉,不是你轻描淡写的“无影响”。
随便删除、降级系统默认安装的包本身就是存在风险的,能避免就避免。
doopsky
帖子: 3
注册时间: 2012-02-08 18:21

Re: freetype-config not found

#6

帖子 doopsky » 2019-05-23 22:28

astolia 版主,你好:

感谢你的指点迷津,我当时是在最小化安装的 Ubuntu Server 19.04 中测试的,apt-get remove libfreetype6 后并没有什么问题,所以我就写了个”无所谓“,确实没在带有桌面环境下测试。

再通过 apt-get 安装的 libfreetype6-dev 下,通过替换 freetype-config 为 pkg-config 后,编译顺利通过。

编译安装PHP前,一共在两个文件中替换内容:
./configure
./ext/gd/config.m4

或者在 PHP 目录下使用以下命令:

代码: 全选

cd php-7.3.5/
sed -i "s/freetype-config/pkg-config/g" ./configure
sed -i "s/freetype-config/pkg-config/g" ./ext/gd/config.m4
再次表达感谢!
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: freetype-config not found

#7

帖子 astolia » 2019-05-25 19:12

doopsky 写了: 2019-05-23 22:28 通过替换 freetype-config 为 pkg-config 后,编译顺利通过。

编译安装PHP前,一共在两个文件中替换内容:
./configure
./ext/gd/config.m4

或者在 PHP 目录下使用以下命令:

代码: 全选

cd php-7.3.5/
sed -i "s/freetype-config/pkg-config/g" ./configure
sed -i "s/freetype-config/pkg-config/g" ./ext/gd/config.m4
再次表达感谢!
编译通过不代表你做正确了。

很明显你不了解pkg-config的功能,也没有仔细看我上面贴的两段代码的不同之处。pkg-config作为一个通用的配置工具,肯定不能直接替代freetype专用的freetype-config。

我上面贴出来了用到了freetype-config的全部地方,可以看到它有两种用法。一是检测freetype-config是否存在,二是执行freetype-config --cflags/--libs来获取编译/链接时的参数。

执行freetype-config --cflags/--libs 实际上就是在执行 pkg-config freetype2 --cflags/--libs。所以要想让它真正正常工作,还要在执行--cflags/--libs时给pkg-config指定包名freetype2。

至于你的错误改法为什么能编译通过,是因为单纯指定--with-freetype-dir并不会连带启用gd支持。所以根本就没有去编译./ext/gd下面的东西,有错误内容的FREETYPE2_CFLAGS和FREETYPE2_LIBS也没有得到应用。
回复