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
相关产品推荐
相关产品推荐

