13

在我的 SConscript 我有以下行:

Program("xtest", Split("main.cpp"), LIBS="mylib fltk Xft Xinerama Xext X11 m")

如何让 scons 使用 mylib.a 而不是 mylib.so,同时与其他库动态链接?

编辑:希望尽可能少地使用特定于平台的黑客。

4

2 回答 2

14

传递包含在 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 以获得您想要的内容,但需要注意的是您正在绕过库依赖项扫描器 - 不会检查库的状态以进行重建。

于 2010-06-08T09:07:09.957 回答
5

为了使这个平台独立,您将 env['SHLIBSUFIX'] 附加到您要使用的库中。env['SHLIBSUFIX'] 为您提供共享库的此环境后缀。

您还拥有 ['SHLIBPREFIX']、['LIBPREFIX']、['LIBSUFFIX'] 和 ['PROGSUFFIX'],它们都适用于这种情况。

编辑:

我显然没有让自己理解,所以我会澄清一下。这些查找的返回值是平台使用的前缀/后缀的字符串。通过这种方式,您可以在每个平台上引用您需要的文件。请注意,您不能将其用作纯字符串,它必须按照 BennyG 的建议嵌入为文件节点。无论如何,使用节点是最好的解决方案,因为文件节点比字符串更通用。

希望这可以帮助。

于 2010-06-08T06:58:22.713 回答