使用SCons导入库构建的不同目标目录

时间:2016-10-14 06:28:24

标签: build scons

我构建了我的共享库:

env.SharedLibrary(target,Split(sources))

文件说 "在Windows系统上,除了共享(.dll)库之外,SharedLibrary构建器方法将始终构建一个导入(.lib)库,添加一个具有相同基本名称的.lib库"。这是对的,但我需要另一个目录,所以我的问题:

是否可以为导入库设置另一个目标目录? 我想在不同的目录中使用.dll和.lib:

bin/target.dll
lib/target.lib

可以在VS项目中完成,但我还需要Scons的决定。 感谢。

UPD: 我们有以下结构

/project
       /bin
       /lib
       /include
       /source
           SConstruct
           /library
             lib.cpp
             SConscript

           /app
              SConscript
              main.cpp

app取决于图书馆 以下脚本非常简化 SConstruct

g_env = Environment()
...
g_target = 'Library_' + g_arch
if g_debug: g_target += 'd'
SConscript('library/SConscript')
SConscript('app/SConscript')

library / SConscript

sources = [ .. ]
env_lib = g_env.Clone()
...
env_lib.SharedLibrary('#../lib/' + g_target,sources)

app / SConscript

sources = [ .. ]
app_env = g_env.Clone()
app_env.Append(LIBPATH = Split('#../lib'))
app_env.Append(LIBS = Split(g_target))
app_env.Program('app',sources)  

如果我去app目录并运行

scons -u 

我得到了我所需要的一切:

lib/Library.dll
lib/Library.lib
source/app/app.exe

但是,如果我只想重建图书馆运行
scons -u
来自library目录 - 只是构建我的.obj文件,没有最终的共享库 我不知道它为什么会这样,我对它不太熟悉。但是现在我们需要在不同的目录中获取最终库(lib中的.lib,bin中的.dll),如上所述。

3 个答案:

答案 0 :(得分:0)

执行此操作的标准方法是使用Install()方法(请参阅第11章“在我们here的其他目录中安装文件”):

Install('lib','bin/target.lib')

答案 1 :(得分:0)

您应该在对SharedLibrary()

的调用中设置no_import_lib
env_lib.SharedLibrary('#../lib/' + g_target,sources,no_import_lib=True)

另外,您输出的是.exp文件吗?

答案 2 :(得分:0)

只需在目标文件列表中列出库的名称。

env.SharedLibrary([target, 'lib/anyname.lib'], Split(sources))

SCons将根据后缀(LIBSUFFIX)识别目标.lib文件,并将自动调整链接程序的/IMPLIB自变量。