如何强制使用静态库而不是共享?

时间:2010-06-07 02:08:28

标签: static portability static-linking scons build-system

在我的SConscript中,我有以下几行:

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

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

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

2 个答案:

答案 0 :(得分: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以获得你想要的东西,但是你要绕过库依赖扫描程序 - 不会检查库的状态以进行重建。

答案 1 :(得分:5)

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

你还有['SHLIBPREFIX'],['LIBPREFIX'],['LIBSUFFIX']和['PROGSUFFIX'],这些都适用于这样的情况。

修改

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

希望这有帮助。