在我的 SConscript 我有以下行:
Program("xtest", Split("main.cpp"), LIBS="mylib fltk Xft Xinerama Xext X11 m")
如何让 scons 使用 mylib.a 而不是 mylib.so,同时与其他库动态链接?
编辑:希望尽可能少地使用特定于平台的黑客。
在我的 SConscript 我有以下行:
Program("xtest", Split("main.cpp"), LIBS="mylib fltk Xft Xinerama Xext X11 m")
如何让 scons 使用 mylib.a 而不是 mylib.so,同时与其他库动态链接?
编辑:希望尽可能少地使用特定于平台的黑客。
传递包含在 File 节点中的完整文件路径将强制进行静态链接。例如:
lib = File('/usr/lib/libfoo.a')
Program('bar', 'main.c', LIBS = [lib])
将产生以下链接器命令行
g++ -o bar main.o /usr/lib/libfoo.a
注意“-l”标志是如何没有传递给这个 LIBS 条目的链接器的。这有效地强制静态链接。另一种方法是修改 LINKFLAGS 以获得您想要的内容,但需要注意的是您正在绕过库依赖项扫描器 - 不会检查库的状态以进行重建。
为了使这个平台独立,您将 env['SHLIBSUFIX'] 附加到您要使用的库中。env['SHLIBSUFIX'] 为您提供共享库的此环境后缀。
您还拥有 ['SHLIBPREFIX']、['LIBPREFIX']、['LIBSUFFIX'] 和 ['PROGSUFFIX'],它们都适用于这种情况。
编辑:
我显然没有让自己理解,所以我会澄清一下。这些查找的返回值是平台使用的前缀/后缀的字符串。通过这种方式,您可以在每个平台上引用您需要的文件。请注意,您不能将其用作纯字符串,它必须按照 BennyG 的建议嵌入为文件节点。无论如何,使用节点是最好的解决方案,因为文件节点比字符串更通用。
希望这可以帮助。