首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能使用链接函数呢?

为什么我不能使用链接函数呢?
EN

Stack Overflow用户
提问于 2021-02-15 18:26:12
回答 1查看 79关注 0票数 0

我正在使用Gtkmm4开发一些库。这个库的目的是替换已删除的Gtkmm3 API (如Gtk::Window::move)。特别是对于这个特定的函数,我需要使用gdk_x11_surface_move。链接器表示对gdk_x11_surface_move的未定义引用。我的库libgdp.so链接到以下Gtk库:

代码语言:javascript
复制
$ ldd libgdp.so.1 | grep gtk
    libgtkmm-4.0.so.0 => /home/user/.local/built/lib/libgtkmm-4.0.so.0 (0x00007f981fb5a000)
    libgtk-4.so.1 => /home/user/.local/built/lib/libgtk-4.so.1 (0x00007f981d57a000)

在这个libgtk-4.so.1中,定义了gdk_x11_surface_move

代码语言:javascript
复制
$ nm  /home/user/.local/built/lib/libgtk-4.so.1 --defined-only | grep x11_surface_move
0000000000461cc0 t gdk_x11_surface_move
0000000000462730 T gdk_x11_surface_move_to_current_desktop
0000000000462540 T gdk_x11_surface_move_to_desktop

有趣/重要的输出可能是以下输出,其中不存在gdk_x11_surface_move

代码语言:javascript
复制
$ nm -D /home/papa/.local/built/lib/libgtk-4.so.1 --defined-only | grep x11_surface_move
0000000000462730 T gdk_x11_surface_move_to_current_desktop
0000000000462540 T gdk_x11_surface_move_to_desktop

在我的代码中,我像这样使用gdk_x11_surface_move

window.cpp

代码语言:javascript
复制
#include <window.hpp>

...

void Window::move(int x, int y) {
    auto surface = this->get_surface().get();
    gdk_x11_surface_move(surface, x, y);
}

...

window.hpp

代码语言:javascript
复制
...

extern "C" {
    void gdk_x11_surface_move(Gdk::Surface *surface, int x, int y);
}

...

我只是不明白为什么我不能在我的库中使用这个函数,即使它是在Gtk库中定义/可用的。你能找到解决办法吗?如果你需要更多的细节,请给我写一个评论,让我知道!

使用以下命令编辑库gets:

代码语言:javascript
复制
/bin/bash ./libtool  --tag=CXX --silent  --mode=link g++  -g -O2 -version-info 1:0: -L/home/user/.local/built/lib  -o libgdp.la -rpath /home/user/.local/built/lib src/libgdp_la-logger.lo src/libgdp_la-window.lo src/libgdp_la-utils.lo -L/home/user/.local/built/lib -lgtkmm-4.0 -lpangomm-2.48 -lgiomm-2.68 -lglibmm-2.68 -lcairomm-1.16 -lsigc-3.0 -lgtk-4 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -L/home/user/.local/built/lib

以及具有以下命令的应用程序,该命令引发错误:

代码语言:javascript
复制
g++  -g -O2  -L/home/user/.local/built/lib  -o gdp-screenshot src/gdp_screenshot-main.o src/gdp_screenshot-application.o src/gdp_screenshot-prefswindow.o src/gdp_screenshot-savewindow.o src/gdp_screenshot-screenshot.o -L/home/user/.local/built/lib -L/home/user/Programme/c++/GDP-Gtk/libgdp/.libs -lgdp -lgtkmm-4.0 -lpangomm-2.48 -lgiomm-2.68 -lglibmm-2.68 -lcairomm-1.16 -lsigc-3.0 -lgtk-4 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lX11 -L/home/user/.local/built/lib -lgtkmm-4.0 -lpangomm-2.48 -lgiomm-2.68 -lglibmm-2.68 -lcairomm-1.16 -lsigc-3.0 -lgtk-4 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -L/home/user/.local/built/lib -lfribidi -L/home/user.local/built/lib -lglibmm-2.4 -lgobject-2.0 -lglib-2.0 -lsigc-2.0 -L/home/user/.local/built/lib
/home/user/Programme/c++/GDP-Gtk/libgdp/.libs/libgdp.so: warning: undefined reference to »gdk_x11_surface_move(Gdk::Surface*, int, int)«
collect2: error: ld returned 1 exit status
Makefile:525: recipe for target 'gdp-screenshot' failed

实际上,在链接使用libgdp.so库的应用程序的阶段中抛出。库本身编译和链接良好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-17 02:39:26

我只是不明白为什么我不能在我的库中使用这个函数,即使它是在Gtk库中定义/可用的。$ nm /home/user/.local/built/lib/libgtk-4.so.1 --defined-only | grep x11_surface_move

0000000000461cc0 t gdk_x11_surface_move

函数在libgtk-4.so.1中定义是正确的,但错误在于它是可用的:t in nm输出意味着它是一个本地函数。这样的函数不能从外部调用。

函数可能得到本地链接的原因有几个:

  1. 函数在定义函数的文件中声明为static
  2. 函数是全局的,但隐藏在编译(-fvisibility=hidden)或链接时间(使用链接器版本脚本)。

修复取决于函数为什么是本地的。对于上面的内容,删除static限定符就可以了。对于2),您可能需要添加__attribute__((visibility("default"))),或者您可能需要编辑链接器版本脚本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66213416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档