如何将已编译的“.so”库与 Scons 链接?

问题描述 投票:0回答:3

我有一个现有的

.so
库(libgit2),我想在C程序中使用它(构建系统是Scons)。我通读了整个 Scons 文档“第 4 章:构建和链接库”,但没有提及如何使用现有的
.so
库。整个第 4 章中唯一提到
.so
的是在第一页,并且仅涉及 Scons 使用
.so
文件进行输出。如何在 Scons 中使用现有已编译的
.so
库?

c build shared-libraries scons
3个回答
0
投票

如果您使用 sconscript 那么您应该添加

LIBS=
参数和
LIBS_PATH=

如果您想直接将其添加到构建行,请使用

-L
作为库路径,并使用
-l
链接库。

您可以在此处找到更多信息:https://scons.org/doc/0.97/HTML/scons-user/x628.html


0
投票

在 SCons Discord 服务器和其他地方的帮助下,我比第一次发布这个问题时走得更远。我还没有解决使用

.so
库与 GDNative 的具体问题,但我想我已经弄清楚了 SCons 方面。

在我发布这个问题时,如果我不使用 libgit2 而只是打印出文本,则 SConstruct 文件能够编译工作代码。仅包含标头,我对

git_libgit2_version
的测试调用已编译但未运行,正如 Godot 所说
undefined symbol: git_libgit2_version

首先,您需要将

LIBS
的命名参数添加到
env.SharedLibrary
env.Program
行。
lib
前缀和
.so
后缀似乎是自动添加的,我仍然没有弄清楚如何让它指向
libgit2.so.1.0.1
(所以现在我已经复制了库并命名为
libgit2.so
,但我希望它最终指向
libgit2.so.1.0.1
)。另外,SCons 团队建议添加
LIBPATH
,但这似乎实际上没有任何作用。

library = env.SharedLibrary(target=env["target_path"] + env["target_name"] , source=sources, LIBS=['git2'])

那么,SConstruct 文件需要有这样一行神奇的内容:

env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1

使用上面的代码,

ldd
会报告
not found
,Godot会说
Error: libgit2.so.1.0: cannot open shared object file: No such file or directory
(我不知道为什么它要求
.so.1.0
而不是
.so
.so.1.0.1
文件,是的,我尝试过复制并命名为
libgit2.so.1.0
并且这也不会改变任何内容)。

我还添加了这个,这是另一位 GDNative 用户建议的。

env.Append(LINKFLAGS=[
    '-Wl,-rpath,addons/git_for_godot/gdnative/linuxbsd'
])

使用上述所有代码,这似乎允许

ldd
和Godot通过相对路径很好地找到库(运行
ldd
时,您必须
cd
进入项目文件夹)。我可以正常运行该项目,没有任何错误,但项目在打开后立即崩溃,并且没有打印任何错误消息。如果我注释掉对
git_libgit2_version
的调用但保留包含标头,则该文件会编译并运行。每当我尝试从
libgit2
调用任何内容时,都会导致 Godot 崩溃而不打印任何错误。此时我陷入困境,我不知道我做错了什么。

我确实尝试将

libgit2
添加到
.gdnlib
文件的依赖项部分,但这似乎不会影响任何内容。我尝试的另一件事不起作用是这一行(扩展名上的变体)附加到作为命名的
source
参数传递的源列表。为了完整起见,我将其发布在这里,但目前我已将此行注释掉,因为它不起作用:

sources.append(File("project/addons/git_for_godot/gdnative/linuxbsd/libgit2.so"))

0
投票

对于当前的 scons,它完全隐藏在 文档中,但是如果您有现有的环境,您可以执行以下操作:

env.Append(LIBS=File('/tmp/mylib.so'))

它会为您将命名的

.so
添加到链接器行中。

© www.soinside.com 2019 - 2024. All rights reserved.