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

如何从我的库中调用可执行文件中的函数?

唐弘和
2023-03-14
问题内容

我有一个可执行文件和一个动态库(.so)。该库会导出一些符号,并且可执行文件会成功调用它。但是我想使库调用可执行文件的功能成为可能。我试图在可执行文件中执行以下操作:

//test
extern "C" void print(const char * str) {
    std::cout << str << std::endl;
}

和这个在图书馆:

extern "C" void print(const char *);

但是当我调用dlopen可执行文件(以加载库)时,它返回error undefined symbol: print。我该如何解决?


问题答案:

在Linux / ELF中,您可以将-export- dynamic选项传递给链接器(-rdynamic编译器驱动程序上gcc),以便将可执行文件中的符号导出到共享库中。

print的库中会有一个虚拟实现,该实现会被可执行文件上的实现所遮盖,因为通常在共享对象之前搜索可执行文件以进行符号解析。

这样做的缺点是,它的粒度不是很精细,最终可能会覆盖一些您不希望使用的符号。更精细的选项是创建要导出为的符号列表:

{
    print;
    <other symbols>
};

并将该列表传递给链接器,例如从gcc: -Wl,--dynamic-list=<file with list of symbols>



 类似资料:
  • 问题内容: 我需要从我的Python脚本执行该脚本。 可能吗?该脚本会生成一些输出,并写入一些文件。如何访问这些文件?我尝试了子流程调用功能,但没有成功。 应用程序“ bar”还引用了一些库,除了输出外,它还创建了文件“ bar.xml”。我如何访问这些文件?只是通过使用open()? 谢谢, 编辑: Python运行时的错误仅是这一行。 问题答案: 要执行外部程序,请执行以下操作: 是的,假设您

  • 我想将我的Android库发布到maven存储库(目前只有本地存储库),所以我使用插件并使用终端命令来做到这一点。 是否有可能将该命令添加到构建中。gradle:所以发布任务将在构建时触发? 第二个问题,是否有可能从aar自动向pom文件添加依赖项,因为gradle默认情况下不会这样做,现在我正在使用在这里找到的解决方案Gradle不包括已发布的pom.xml中的依赖项。 干杯Wojtek

  • 我最近完成了我的第一个JavaFX应用程序的工作。它与在本地服务器上设置的MySQL数据库连接。在使用该应用程序之前,我需要启动使用Xampp运行的服务器。现在我想最终将我的应用程序打包到一个. exe文件中并使用它。在服务器和数据库方面,我完全是个新手。我的问题是——一旦用户打开它,我该怎么做才能让我的应用程序与数据库本身连接?我需要从本地主机服务器切换到不需要每次都启动它的远程服务器吗? 我的

  • 我已经创建了一个cocoapod-rpupdatingLabelFramework并添加了一个readme.md文件。我在readme.md文件中添加了一个链接(相对路径)到一个图像(我的存储库的一部分)。当我将存储库提交并推送到github-raunakp/rpupdatinglabel时,我可以在Github呈现的readme.md文件中看到图像。 但是,我在Cocoapod呈现的readme

  • 我在这里漏掉了什么?这是我第一次使用可执行jar文件。在可执行jar文件中调用类的方法时,有什么特别需要做的吗?

  • 问题内容: 是否可以从Go调用静态对象(.so)文件?我一直在搜寻Google,我不断提出我可以做到的主张 但是尝试这样做会出现错误 并搜索Godocs,但在syscall包中找不到对此功能的引用。是否可以加载库并调用其函数? 问题答案: 在POSIX平台上,您可以用来调用dlopen和朋友: