当前位置: 首页 > 面试题库 >

来自便捷库的符号未导出到可执行文件中

卫鸿朗
2023-03-14
问题内容

我有一个myprogram与静态便利库链接的程序,称为它libconvenience.a,其中包含一个函数func()。该函数func()未在中的任何地方调用myprogram;它需要能够从插件库调用plugin.so

该符号func()未在中动态导出myprogram。如果我跑步

nm myprogram | grep func

我什么都没有。但是,它并不缺少libconvenience.a

nm libconvenience/libconvenience.a | grep func
00000000 T功能

我使用的是automake,但是如果我在命令行上手动执行最后一个链接,那么它也不起作用:

gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/libconvenience.a `pkg-config --libs somelibraries`

但是,如果我这样链接程序,则跳过便利库的使用,libconvenience.a直接链接到本应直接进入的目标文件,它们会func()显示在myprogram的符号中,如下所示:

gcc -Wl,--export-dynamic -o myprogram *.o libconvenience/*.o `pkg-config --libs somelibraries`

如果我在中的func()某处添加了虚拟呼叫myprogram,则func()还会在myprogram的符号中显示。但是我认为--export- dynamic应该导出所有符号,而不管程序中是否使用了它们!

我在Fedora 14上使用automake 1.11.1和gcc 4.5.1。我也在使用Libtool
2.2.10进行构建plugin.so(但不是便捷库。)

我没有忘记把-Wl,--export- dynamicmyprogram_LDFLAGS,我也没有忘记把包含源func()libconvenience_a_SOURCES(谷歌搜索的一些建议,这些都是这个问题的常见原因。)

有人可以帮我了解这里发生了什么吗?


问题答案:

我设法解决了。约翰·卡索特(John Calcote)出色的《自动工具》(Autotools)书中的这条注释为我指明了正确的方向:

链接器将在命令行上显式指定的每个目标文件添加到二进制产品中,但是它们仅从归档中提取在链接的代码中实际引用的那些目标文件。

要抵消这种行为,可以使用该--whole- archive标志来libtool。但是,这也会导致从所有系统库中提取所有符号,从而导致许多双重符号定义错误。因此,--whole- archive需要libconvenience.a在链接器命令行上紧接其前,并且紧随其后,--no-whole- archive以免其他库受到这种对待。这有点困难,因为automake和libtool不能真正保证在命令行上将标志保持相同的顺序,但是这一行Makefile.am起到了作用:

myprogram_LDFLAGS = -Wl,--export-dynamic \
    -Wl,--whole-archive,libconvenience/libconvenience.a,--no-whole-archive


 类似资料:
  • 以下是不同的Makefile: libcds/src: SSA2: (std::basic_ostream>&,char const*,int)U std::__throw_bad_cast() U std::cout 所以实际上这可能与链接器错误有关:未定义对`std::ctype ::_m_widen_init()的引用

  • 我在安装Psycopg2时遇到了麻烦。尝试时出现以下错误: 但问题是实际上在我的中;它运行起来没有任何问题: 我对这些错误感到困惑。有人能帮忙吗? 顺便说一下,我所有命令。我也在RHEL 5.5上。

  • 问题内容: 我在将当前项目提取到可执行jar文件时遇到问题。当我在日食中按下运行按钮时,一切正常,但是当我这样做时 然后启动.jar文件;我唯一得到的是带有灰色画布的窗口。它应该启动我编写的游戏(spaceInvaders)。 这是我上载项目的github的链接。我真的不知道错误在哪里,在哪里看。在我的代码中?在我安装的JRE / JDK中?创建罐子时我做错什么了吗? 请帮忙 -。- 问题答案:

  • 当我试图将我的项目导出到可执行的。jar文件时,像hibernate.cfg.xml或log4j-properties这样的配置文件不会导出到JAR中。我必须手动将它们添加到存档中。文件位于项目根文件夹中的/target/文件夹中。 如何让Eclipse也导出配置文件?

  • 我试图理解java中完整期货的非阻塞回调性质 有了上面的代码,我总是看到下面看到的输出 线程名称ForkJoinPool.common池工人-1 thenApply Thread name main thenApply Thread name main thenAcceptThread name main Thread name main 这个顺序似乎建议主线程等待所有Futures线程的执行。

  • 我尝试将一个具有不同库的Java项目导出到一个可运行的JAR文件中,其中包括一个JavaFX GUI和许多不同的东西。当我在eclipse中运行我的项目时,没有问题。但是,当我试图将它导出到一个可运行的JAR文件,然后我尝试启动时,它从来没有打开一个窗口,只有一个进程在后台运行。 我不知道如何更好地描述我的问题。但也许你已经可以帮我了解这些信息了。 (使用eclipse)