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

monwx1rj  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(123)

我有一个现有的.so库(libgit2),我想在C程序中使用它(构建系统是Scons)。我通读了整个Scons documentation for "Chapter 4. Building and Linking with Libraries",但没有提到如何使用现有的.so库。在第4章中唯一提到.so的地方是在第一页,它只是关于Scons使用.so文件进行输出。如何在Scons中使用现有的已编译.so库?

yyhrrdl8

yyhrrdl81#

如果你使用sconscript,那么你应该添加一个LIBS=参数和一个LIBS_PATH=参数。
如果你想直接将其添加到构建行,使用-L作为库路径,使用-l链接库。
您可以在这里找到更多信息:https://scons.org/doc/0.97/HTML/scons-user/x628.html

nfzehxib

nfzehxib2#

在SCons Discord服务器和其他地方的帮助下,我比第一次发布这个问题时走得更远。我还没有解决在GDNative中使用.so库的具体问题,但我想我已经解决了SCons方面的问题。
在我提出这个问题时,如果我不使用libgit2,而只是打印出文本,SConstruct文件就能够编译工作代码。只包含头文件,我对git_libgit2_version的测试调用编译了,但没有运行,正如Godot所说的undefined symbol: git_libgit2_version
首先,您需要将LIBS的命名参数添加到env.SharedLibraryenv.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用户的suggested

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

使用上述所有代码,这似乎允许ldd和Godot通过相对路径找到库(当运行ldd时,您必须将cd 'd放入项目文件夹)。我可以正常运行项目而没有任何错误,但是项目在打开后立即崩溃,没有打印任何错误消息。如果我注解掉对git_libgit2_version的调用,但保留头文件,则该文件将编译并运行。每当我尝试从libgit2调用任何东西时,它都会导致Godot崩溃,而不会打印任何错误。在这一点上,我卡住了,我不知道我做错了什么。
我确实尝试将libgit2添加到.gdnlib文件的扩展部分,但这似乎没有任何影响。我尝试的另一个不起作用的是这一行(+扩展名上的变体),它附加到作为命名的source参数传递的源列表。为了完整起见,我将把它贴在这里,但目前我已经注解了这一行,因为它不起作用:

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

zbsbpyhn3#

对于当前的scons,它完全隐藏在文档中,但如果你有一个现有的环境,你可以做以下事情:

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

它将为您添加命名的.so到链接器行。

相关问题