You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu Docker容器编译应用时如何解决未定义引用错误?

问题描述
  • 在Ubuntu Docker容器中编译应用,此前类似环境及本地机器均可正常编译
  • 容器内编译时出现两个未定义引用错误:gtk_widget_get_color 和 gtk_css_provider_load_from_string
  • 将本地生成的可执行文件复制到容器后,运行时会触发gtk_css_provider_load_from_string错误,程序继续执行大概率也会出现gtk_widget_get_color的错误

编译错误示例

1.768 /usr/bin/ld: /tmp/cc6uigiC.o: in function `make_word':                                                                                                                                                      
1.768 coeus.c:(.text+0x1c004): undefined reference to `gtk_css_provider_load_from_string'

环境配置信息

Dockerfile内容

FROM kasmweb/ubuntu-jammy-desktop:1.18.0-rolling-weekly
USER root

ENV HOME /home/kasm-default-profile
ENV STARTUPDIR /dockerstartup
ENV INST_SCRIPTS $STARTUPDIR/install
WORKDIR $HOME

######### Customize Container Here ###########



COPY hsm-repo /hsm-repo
RUN apt-get -y update
RUN apt-get -y install libpq-dev
RUN apt-get -y install libadwaita-1-dev
RUN apt-get -y install libgtk-4-dev
WORKDIR /hsm-repo

RUN apt-get install libcurl4-gnutls-dev -y
RUN gcc $( pkg-config --cflags gtk4 ) $(pkg-config --cflags libpq) -o coeus coeus.h coeus.c $( pkg-config --libs gtk4 ) $( pkg-config --libs libpq) -lcurl -w -lpthread
RUN chmod +x coeus



######### End Customizations ###########

RUN chown 1000:0 $HOME
RUN $STARTUPDIR/set_user_permission.sh $HOME

ENV HOME /home/kasm-user
WORKDIR $HOME
RUN mkdir -p $HOME && chown -R 1000:0 $HOME

USER 1000

系统版本信息(cat /etc/os-release输出)

PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
解决方案

1. 明确API版本冲突原因

gtk_widget_get_color和gtk_css_provider_load_from_string都是GTK 3的专属API,在GTK 4中已被移除或替换。你的Dockerfile安装的是GTK 4依赖,但代码调用了GTK 3的接口,这是错误的核心原因。

2. 切换为GTK 3依赖环境

修改Dockerfile中的依赖安装与编译命令:

  • 替换GTK 4依赖为GTK 3:
    # 替换原libgtk-4-dev的安装命令
    RUN apt-get -y install libgtk-3-dev
    
  • 调整编译命令的pkg-config参数:
    RUN gcc $( pkg-config --cflags gtk+-3.0 ) $(pkg-config --cflags libpq) -o coeus coeus.h coeus.c $( pkg-config --libs gtk+-3.0 ) $( pkg-config --libs libpq) -lcurl -w -lpthread
    

3. 验证依赖有效性

编译前可执行以下命令确认GTK 3依赖是否正确识别:

pkg-config --modversion gtk+-3.0

Ubuntu 22.04环境下应输出3.24.x系列版本号。

4. 代码适配GTK 4(可选)

如果需要保留GTK 4环境,需修改代码适配新API:

  • 替换gtk_widget_get_color:通过gtk_widget_get_style_context获取样式上下文,再调用gtk_style_context_get_color获取颜色
  • 替换gtk_css_provider_load_from_string:改用gtk_css_provider_load_from_data,需额外传入字符串的字节长度参数

内容的提问来源于stack exchange,提问作者Oliver Cox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 18:37:30