安装GD库和FREE TYPE

本文详细介绍了因Freetype未安装导致PHP CMS系统验证码无法显示的问题,并提供了详细的解决方案,包括Freetype的安装与配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蛋疼的玩意,GD库装上后FREE TYPE不装的话。PHPCMS的验证码出不来,因为里面有个imagettftext 函数不存在,所以在网上找了个教程,解决了问题,谢谢作者


http://www.topthink.com/topic/7645.html


常见的GD未安装及BOM问题办法就不细说了,度娘上答案较多。
可是我遇到的验证码不显示不是这类原因导致的,反复检查最后才确定了是FreeType字体引擎未安装的原因。

首先,打开TP调试模式,右键打开验证码错误图标,会发现标志性的报错,

call to undefined function Think/imagettftext
单独php探针一下,环境中的确不存在这个函数。查php手册,发现该函数需要GD和freetype支持,GD我是确认安装的,freetype没有安装,起先一度以为unbuntu下apt-get搜索到并安装一个libfreetype6-dev包就行了,可是问题依然存在,于是一段时间内竟然忽略了这个真正的原因。

最后才明确到问题的确是在freetype 上,只是我的安装freetype的方法不对。
大家如果排除了GD和bom问题,验证码依然不存在,就可以在phpinfo查看GD节区,看看是否有三行Freetype的描述(广义来说,其实这也算GD支持不完整的问题),如果没有,就应该是没有安装freetype了

解决方法如下:
先去Freetype官网http://www.freetype.org/下载源码
tar -jxvf freetpe.tar.gz
cd freetype
./configure --prefix=/usr/local/freetype --enable-shared
make && make install


Ok, freetype安装好后,我们重新编译GD把freetype编译进去
在GD拓展源码目录下
cd 你的源码目录/ext/gd   #进入gd源码目录
你的目录/phpize      #可能需要你phpize生成configure文件,如果已存在,则跳过
./configure --prefix=/usr/local/gd --with-freetype-dir=/usr/local/freetype

#configure这一步可能会报错不能include freetype.h 文件,原因是configure里对头文件指定路径不对,需要你去freetype的安装路径下做个软连接。
#cd /usr/local/freetype/include/freetype2
#sudo mkdir freetype
#cd freetype
#ln -s ../freetype.h freetype.h
#ok,我们继续下去

make && make install
最后把生成的gd.so文件根据你的php.ini中的配置路径就行了

最后查看一下phpinfo,已经出现freetype信息,验证码也能正常显示了。

尼玛,这个帖子发不出来,包含敏感词汇,那给个提示哪里敏感呗,还得一个个来排查
好吧,我想问,为啥帖子里中文单词chuli要算作敏感词啊,坑爹是不                                  

<think>好的,我现在需要帮助用户解决如何使用GD32的标准配置ADC0使用6个通道(PA0到PA5)的问题。首先,我得回忆一下GD32的ADC配置步骤。通常,配置ADC需要初始化时钟、GPIO、ADC模块,设置通道序列,可能还要配置扫描模式连续转换等。 首先,用户提到的标准,可能类似于STM32的标准,因为GD32STM32有相似的外设设计。所以,我需要确认GD32的标准函数结构体是否与STM32类似。例如,ADC初始化可能会用到adc_init_type结构体,包括mode、scan_mode、continuous_mode等参数。 接下来是GPIO配置。PA0到PA5作为模拟输入,需要设置GPIO为模拟模式。GD32的GPIO模式配置函数可能是gpio_init(),模式选择GPIO_MODE_AIN。然后,开启GPIOA的时钟ADC0的时钟。GD32的时钟使能函数可能是rcu_periph_clock_enable(),参数如RCU_GPIOARCU_ADC0。 然后是ADC的配置。需要初始化ADC参数,比如设置扫描模式,因为要使用多个通道。扫描模式需要使能,并且设置通道数量。通道的转换顺序需要配置,可能需要使用adc_channel_length_config()来设置长度,然后用adc_regular_channel_config()逐个添加通道的顺序。 还要注意ADC的时钟分频,确保不超过最大允许的时钟频率。GD32的ADC时钟通常由APB2总线分频而来,可能需要调用adc_clock_config()来设置分频系数,比如ADCCK_PCLK2_DIV6。 此外,校准ADC也是必要的步骤,通常在初始化之后进行校准,使用adc_calibration_enable()函数。 中断处理可能也是需要考虑的,如果用户需要中断方式读取转换结果,但用户的问题中没有提到中断,所以可能只需要轮询方式。但配置中可能需要开启DMA或者连续转换模式,特别是当使用多个通道时,扫描模式通常需要DMA来传输数据,或者使用中断来读取每个通道的结果。 需要检查每个步骤是否正确,比如通道的编号是否正确对应PA0到PA5。例如,PA0可能对应通道0,PA1到通道1,依此类推。在配置规则组通道时,需要按照顺序添加这些通道的编号,并设置每个通道的采样时间。 可能还需要使能ADC的外部触发,或者配置为软件触发模式。在标准中,可能通过adc_external_trigger_config()来设置触发源为软件触发,然后使用adc_software_trigger_enable()来启动转换。 最后,用户可能需要读取各个通道的值,这可以通过adc_regular_data_read()函数来获取每个通道的转换结果。如果是扫描模式,通常需要按照配置的顺序读取数据,或者使用DMA自动存储到指定数组。 需要确认是否存在任何潜在的配置错误,比如时钟未使能、GPIO模式设置错误、通道顺序或数量配置不正确,以及采样时间不足等问题。此外,参考用户提供的引用内容,他们之前在使用FMC时遇到了问题,可能需要注意Flash操作对ADC的影响,但在ADC配置中可能不相关,除非有电源或干扰问题。 总结步骤:初始化时钟、配置GPIO为模拟输入、初始化ADC参数(模式、扫描、连续转换)、设置通道转换顺序长度、配置时钟分频、校准ADC、使能ADC、配置触发方式,最后读取数据。需要确保每个步骤都正确无误,并参考GD32的标准文档或例程来确认函数名称参数的正确性。</think>### GD32标准配置ADC0多通道步骤 #### 1. 时钟使能配置 ```c rcu_periph_clock_enable(RCU_GPIOA); // 开启GPIOA时钟 rcu_periph_clock_enable(RCU_ADC0); // 开启ADC0时钟 rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);// 设置ADC时钟分频为APB2的1/6[^1] ``` #### 2. GPIO模式配置 ```c gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5); // 设置PA0-PA5为模拟输入模式 ``` #### 3. ADC参数初始化 ```c adc_deinit(ADC0); // 复位ADC寄存器 adc_mode_config(ADC_MODE_FREE); // 设置为独立模式 adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); // 启用扫描模式 adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); // 启用连续转换模式 adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); // 数据右对齐 adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 6); // 设置6通道转换 ``` #### 4. 通道顺序配置 ```c // 设置转换顺序(通道0-5对应PA0-PA5) adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5); ``` #### 5. 校准与使能 ```c adc_enable(ADC0); delay_ms(1); // 等待ADC稳定 adc_calibration_enable(ADC0); // 执行校准 adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); // 启动转换 ``` #### 6. 数据读取(轮询方式) ```c uint16_t adc_value[6]; while(1) { if(adc_flag_get(ADC0, ADC_FLAG_EOC)) { for(uint8_t i=0; i<6; i++) { adc_value[i] = adc_regular_data_read(ADC0); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值