我有一个现有的
.so
库(libgit2),我想在C程序中使用它(构建系统是Scons)。我通读了整个 Scons 文档“第 4 章:构建和链接库”,但没有提及如何使用现有的 .so
库。整个第 4 章中唯一提到 .so
的是在第一页,并且仅涉及 Scons 使用 .so
文件进行输出。如何在 Scons 中使用现有已编译的 .so
库?
如果您使用 sconscript 那么您应该添加
LIBS=
参数和 LIBS_PATH=
。
如果您想直接将其添加到构建行,请使用
-L
作为库路径,并使用 -l
链接库。
您可以在此处找到更多信息:https://scons.org/doc/0.97/HTML/scons-user/x628.html
在 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"))
对于当前的 scons,它完全隐藏在 文档中,但是如果您有现有的环境,您可以执行以下操作:
env.Append(LIBS=File('/tmp/mylib.so'))
它会为您将命名的
.so
添加到链接器行中。