使用 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
参数。
我构建了我的共享库:
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
参数。