在编译我的应用程序时,如何解决未定义引用错误?

前端开发 2026-07-09

问题如下:

  1. 我在一个Ubuntu Docker容器中编译我的应用程序;我在类似的环境中以前也编译过,且可以在本地机器上编译。
  2. 当我在容器内编译时,我会遇到两个关于未定义引用到 gtk\_widget\_get\_color' and togtk_css_provider_load_from_string的错误。
  3. 当我把可执行文件简单拷贝到容器中运行时,会遇到后者的错误(如果应用继续运行,理论上也会遇到前面的错误)。
  4. 有什么想法?

示例的编译错误:

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

查看 /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

解决方案

当我在容器内编译时,我会遇到两个关于未定义引用到 gtk\_widget\_get\_color' and togtk_css_provider_load_from_string的错误。

看起来Ubuntu 22.04自带的版本不够新,无法包含这个。

$ docker run --rm -it --entrypoint /bin/bash -u 0 kasmweb/ubuntu-jammy-desktop:1.18.0-rolling-weekly
root@be47e9cd296d:~# apt-get update
[....]
root@be47e9cd296d:/# apt-cache show libgtk-4-dev | grep Version
Version: 4.6.9+ds-0ubuntu0.22.04.2

但这两个函数至少需要4.12或 4.10。 1 2

为了解决这个问题,你可以尝试使用更新的Ubuntu版本,比如24.04,它内置libgtk 4.14.5。或者,你也可以从源码编译libgtk。

当我把可执行文件简单拷贝到容器中时,在运行时会遇到后者错误(如果应用继续运行,理论上会遇到前者)。

动态地链接宿主操作系统的库,并将该可执行文件移到容器中,除非宿主与容器非常相似,否则很可能行不通。通常最好在容器内进行构建。如果对镜像大小有顾虑,可以使用多阶段构建。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章