Ubuntu LTS 20.04环境下graphics.h库settextstyle与setfillstyle函数失效问题及替代字体处理库咨询
问题原因与解决方案
为什么settextstyle和setfillstyle报「隐式函数声明」?
你用的这个graphics.h其实是一个模拟Turbo C图形API的非标准封装库,底层依赖老版本SDL和其他已被弃用的组件(比如你遇到的libesd0-dev)。这类库的核心目的是让旧Turbo C代码能在Linux上运行,但维护非常有限:
- 要么是这个封装库根本没有实现
settextstyle和setfillstyle这两个函数,头文件里自然也没有对应的声明; - 要么是头文件的声明缺失,导致编译器将这两个函数识别为「隐式声明」(C语言默认隐式声明的函数返回
int,即便有实现也大概率类型不匹配,触发报错)。
你可以自行验证:打开系统里的graphics.h头文件(通常在/usr/include目录下),搜索这两个函数的名字,如果找不到声明,就说明这个库确实没支持它们。
替代方案:现代Linux图形库推荐
既然这个兼容库已经跟不上新版Ubuntu的环境,不如直接改用Linux生态下的标准图形库,以下是几个适合C语言开发的选项:
1. SDL2(最推荐,适合图形/游戏类应用)
SDL2是你之前安装的旧SDL的升级版本,是跨平台的多媒体库,有完整的文本渲染支持,能轻松设置字体、大小、颜色。
简单示例代码:
#include <SDL2/SDL.h> #include <SDL2/SDL_ttf.h> int main() { // 初始化SDL和字体库 if (SDL_Init(SDL_INIT_VIDEO) != 0 || TTF_Init() != 0) { return 1; } // 创建窗口和渲染器 SDL_Window* window = SDL_CreateWindow("Text Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); // 加载字体(这里用系统自带的FreeSans字体,路径可能需要调整) TTF_Font* font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeSans.ttf", 24); SDL_Color textColor = {255, 255, 255, 255}; // 白色 SDL_Surface* textSurface = TTF_RenderText_Solid(font, "Hello from SDL2!", textColor); SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface); // 渲染文本 SDL_Rect textRect = {50, 50, textSurface->w, textSurface->h}; SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 黑色背景 SDL_RenderClear(renderer); SDL_RenderCopy(renderer, textTexture, NULL, &textRect); SDL_RenderPresent(renderer); // 等待用户关闭窗口 SDL_Event e; while (SDL_WaitEvent(&e)) { if (e.type == SDL_QUIT) break; } // 清理资源 SDL_DestroyTexture(textTexture); SDL_FreeSurface(textSurface); TTF_CloseFont(font); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); TTF_Quit(); SDL_Quit(); return 0; }
编译命令:
gcc your_file.c -o your_file `sdl2-config --cflags --libs` -lSDL2_ttf
2. GTK3/GTK4(适合桌面GUI应用)
GTK是Linux桌面环境的标准UI库,如果你要开发带按钮、菜单的桌面应用,GTK的文本控件(比如GtkLabel)可以通过CSS或API轻松设置字体样式和大小,上手也很方便。
3. Cairo(适合自定义2D图形渲染)
Cairo是专注于2D图形的渲染库,可以和X11、GTK等结合使用,支持高精度的文本渲染,适合需要手动绘制图形和文本的场景。
内容的提问来源于stack exchange,提问作者Justin Drew
相关产品推荐
相关产品推荐

