Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我不能使用链接的函数?_C++_Shared Libraries_Dynamic Linking_Gtkmm - Fatal编程技术网

C++ 为什么我不能使用链接的函数?

C++ 为什么我不能使用链接的函数?,c++,shared-libraries,dynamic-linking,gtkmm,C++,Shared Libraries,Dynamic Linking,Gtkmm,我正在使用Gtkmm4开发一些库。此库的目的是替换已删除的Gtkmm3 API(例如Gtk::Window::move)。特别是对于这个特殊的函数,我需要使用gdk\u x11\u surface\u move。链接器表示未定义的引用gdk\u x11\u surface\u move。我的库libgdp.so链接到以下Gtk库: $ ldd libgdp.so.1 | grep gtk libgtkmm-4.0.so.0 => /home/user/.local/built/li

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

$ 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

$ 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\u x11\u surface\u move
不存在:

$ 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\u x11\u surface\u move
如下:

window.cpp
#包括
...
空窗口::移动(整数x,整数y){
自动曲面=此->获取曲面().get();
gdk_x11_surface_move(surface,x,y);
}
...
window.hpp
。。。
外部“C”{
void gdk_x11_surface_move(gdk::surface*surface,int x,int y);
}
...
我只是不明白为什么我不能在我的库中使用该函数,即使它在Gtk库中定义/可用。你能找到解决办法吗?如果你需要更多的细节,请给我写评论让我知道

编辑 使用以下命令链接库:

/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
以及应用程序使用以下命令抛出错误:

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
库的应用程序链接的阶段抛出的。库本身编译和链接都很好

我只是不明白为什么我不能在我的库中使用该函数,即使它在Gtk库中定义/可用

$nm/home/user/.local/build/lib/libgtk-4.so.1--仅定义了| grep x11_surface_move

0000000000 461CC0 t gdk_x11_表面_移动

您在
libgtk-4.so.1
中定义的函数是正确的,但您错误地认为它是可用的:
t
nm
输出中表示它是本地函数。这样的函数不能从外部调用

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

  • 函数在定义它的文件中声明为
    static
  • 该函数是全局函数,但在编译(
    -fvisibility=hidden
    )或链接时(使用链接器版本脚本)隐藏
  • 修复取决于函数为何为本地函数。对于上面的1),删除
    static
    限定符即可。对于2),您可能需要添加
    \uuuuuuuuuuu属性((可见性(“默认”))
    ,或者您可能需要编辑链接器版本脚本

    我只是不明白为什么我不能在我的库中使用该函数,即使它在Gtk库中定义/可用

    $nm/home/user/.local/build/lib/libgtk-4.so.1--仅定义了| grep x11_surface_move

    0000000000 461CC0 t gdk_x11_表面_移动

    您在
    libgtk-4.so.1
    中定义的函数是正确的,但您错误地认为它是可用的:
    t
    nm
    输出中表示它是本地函数。这样的函数不能从外部调用

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

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

  • 修复取决于函数为何为本地函数。对于上面的1),删除
    static
    限定符即可。对于2),您可能需要添加
    \uuu属性((可见性(“默认”))
    ,或者您可能需要编辑链接器版本脚本。

    请粘贴准确的错误。@untible done。我假设
    /home/papa/…
    /home/user/…
    实际上是同一条路径?@完全没用,我忘记替换它了!:(抱歉)长时间的回答。<代码> GDKXX11SureSePosie/Cuff>看起来像C函数,链接器抱怨C++函数。也许您忘记了代码>外部“C”。某个地方。请粘贴准确的错误。@Untible done。我假设
    /home/papa/…
    /home/user/…
    实际上是同一条路径?@Untible确切地说,我忘了替换它了!:(抱歉)长回答时间。<代码> GDKXX11SureSePosie/Cuff>看起来像C函数,链接器抱怨C++函数。也许您忘记了代码>外部“C”<代码>某个地方。