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

Different target directory for import library building with SCons

我构建了我的共享库:

env.SharedLibrary(target,Split(sources))

文档说 "On Windows systems, the SharedLibrary builder method will always build an import (.lib) library in addition to the shared (.dll) library, adding a .lib library with the same basename"。没错,但我需要另一个目录,所以我的问题:

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

bin/target.dll
lib/target.lib

在 VS 项目中可以做到,但我还需要为 Scons 做出决定。 谢谢。

更新: 我们有以下结构

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

           /app
              SConscript
              main.cpp

应用依赖库。
以下脚本非常简单。
S构造

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

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

执行此操作的标准方法是使用 Install() 方法(请参阅我们 UserGuide 的第 11 "Installing files in other directories" 章):

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

您应该在对 SharedLibrary() 的调用中设置 no_import_lib

env_lib.SharedLibrary('#../lib/' + g_target,sources,no_import_lib=True)

还有,你输出的是.exp文件吗?

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

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

SCons 会根据后缀 (LIBSUFFIX) 识别目标 .lib 文件,并自动适配链接器的 /IMPLIB 参数。