【问题标题】:Different target directory for import library building with SCons使用 SCons 构建导入库的不同目标目录
【发布时间】:2016-10-14 06:28:24
【问题描述】:

我建立我的共享库:

env.SharedLibrary(target,Split(sources))

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

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

bin/target.dll
lib/target.lib

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

更新: 我们有以下结构

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

           /app
              SConscript
              main.cpp

应用依赖于库。
以下脚本非常简化。
SConstruct

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

图书馆/SConscript

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

应用程序/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)。

【问题讨论】:

  • 如果通过 VS 项目执行此操作,它会做什么?是否为链接器指定了不同的命令行选项?还是 VS 在生成文件后复制/移动生成的文件?
  • @bdbaddog 我尝试像 VS 一样添加命令行选项 /imlib:path/lib/Library.lib。但是 SCons 重写了这个选项——在输出中我看到了我的选项和下一个 Scons 的选项,带有默认目标目录——/implib:/path/bin/Library.lib
  • 您是如何尝试将其添加到命令行的?
  • @bdbaddog env.Append(LINKFLAGS = '/implib:/path/bin/Library.lib') 在构建库之前env.SharedLibrary()

标签: build scons


【解决方案1】:

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

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

【讨论】:

  • 我可以使用 Install('../lib','target.lib')
  • 抱歉,未完成.. 似乎 ../ 路径不适用于安装。或者我做错了什么。
  • 请注意我们“最常见的”FAQs 中的#2。作为默认 SCons 期望位于您的文件夹层次结构的 all 的顶层,包含您安装到的目录。如果还是不行,请提供MVCE
  • 请看看我在第一篇文章中的更新,我添加了项目结构和我们的 Sconsripts 的一些部分。
  • 谢谢,但这仍然不是 MVCE ......而且你没有展示你是如何尝试使用 Install() 的。像这样,我不可能告诉你你做错了什么……因为我看不到你实际上在做什么。 ;)
【解决方案2】:

您应该在调用 SharedLibrary() 时设置 no_import_lib

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多