gpt4 book ai didi

C++ 使用共享库中的函数

转载 作者:行者123 更新时间:2023-11-30 03:20:47 24 4
gpt4 key购买 nike

我有以下问题:

我有两个独立的 C++ 项目,想在另一个项目中使用其中一个的某些功能。我在 Linux 上使用 g++ 进行编译。

我决定通过从项目中创建一个共享库来使用这些函数来实现这一点。我将 -fPIC 添加到 Makefile 中的编译器标志,然后创建了一个共享库,如下所示:

g++ -shared -Wl,-soname,libmyproject.so.1 -o libmyproject.so a.o b.o c.o -lc

然后我简单地将 .so 文件和头文件复制到新项目的(父)目录中,并将以下内容添加到其 Makefile 中:

致图书馆:

-L/../external_proj/libmyproject.so

CXXFLAGS:

-I/../external_proj

然后我在目标项目代码中#include 适当的头文件并尝试从原始项目中调用某些函数。但是,当我编译目标项目时,我收到导入函数的错误“ undefined reference ”。

我的问题是:此设置中是否缺少某些内容?为了导出我想使用的功能,是否可能需要将某些内容添加到原始项目的标题中?

我应该指出,这是我第一次尝试以这种方式使用共享库。谢谢。

最佳答案

-L 选项仅指定目录,链接器将在其中搜索要链接的库。然后您将需要使用 -l 选项来指定共享库的基本名称(不带“lib”前缀和“.so”后缀)。

但即使这样也不太可能足够。当您尝试执行它时,运行时加载程序需要找到共享库。 -L-l 足以成功链接,但运行时加载程序仅搜索 /usr/lib(64)?,并且默认情况下其他几个地方。它不搜索当前目录,ELF 二进制文件只记录必须加载的共享库的名称,而不是它们的完整路径名。您必须显式记录任何额外的目录以搜索任何共享库,这是 -rpath 选项。

要完成这项工作,您还需要将 -rpath 传递给链接器,但 g++ 不支持此选项目录,您将不得不使用 -W 来这样做。

您可能需要的全套选项是:

-L/../external_proj -lmyproject -Wl,-rpath -Wl,`cd ../external_proj && pwd`

有关 -W 选项的更多信息,请参阅 gcc 文档。

绝对路径名应该与-rpath一起使用,因此需要获取共享库所在目录的完整路径名。

关于C++ 使用共享库中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52568811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com