我有一个现有的.so
库(libgit2),我想在C程序中使用它(构建系统是Scons)。我通读了整个Scons documentation for "Chapter 4. Building and Linking with Libraries",但没有提到如何使用现有的.so
库。在第4章中唯一提到.so
的地方是在第一页,它只是关于Scons使用.so
文件进行输出。如何在Scons中使用现有的已编译.so
库?
我有一个现有的.so
库(libgit2),我想在C程序中使用它(构建系统是Scons)。我通读了整个Scons documentation for "Chapter 4. Building and Linking with Libraries",但没有提到如何使用现有的.so
库。在第4章中唯一提到.so
的地方是在第一页,它只是关于Scons使用.so
文件进行输出。如何在Scons中使用现有的已编译.so
库?
3条答案
按热度按时间yyhrrdl81#
如果你使用sconscript,那么你应该添加一个
LIBS=
参数和一个LIBS_PATH=
参数。如果你想直接将其添加到构建行,使用
-L
作为库路径,使用-l
链接库。您可以在这里找到更多信息:https://scons.org/doc/0.97/HTML/scons-user/x628.html
nfzehxib2#
在SCons Discord服务器和其他地方的帮助下,我比第一次发布这个问题时走得更远。我还没有解决在GDNative中使用
.so
库的具体问题,但我想我已经解决了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
,但这似乎实际上没有做任何事情。然后,SConstruct文件需要有这样一个魔术行:
使用上面的代码,
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。
使用上述所有代码,这似乎允许
ldd
和Godot通过相对路径找到库(当运行ldd
时,您必须将cd
'd放入项目文件夹)。我可以正常运行项目而没有任何错误,但是项目在打开后立即崩溃,没有打印任何错误消息。如果我注解掉对git_libgit2_version
的调用,但保留头文件,则该文件将编译并运行。每当我尝试从libgit2
调用任何东西时,它都会导致Godot崩溃,而不会打印任何错误。在这一点上,我卡住了,我不知道我做错了什么。我确实尝试将
libgit2
添加到.gdnlib
文件的扩展部分,但这似乎没有任何影响。我尝试的另一个不起作用的是这一行(+扩展名上的变体),它附加到作为命名的source
参数传递的源列表。为了完整起见,我将把它贴在这里,但目前我已经注解了这一行,因为它不起作用:zbsbpyhn3#
对于当前的scons,它完全隐藏在文档中,但如果你有一个现有的环境,你可以做以下事情:
它将为您添加命名的
.so
到链接器行。