【发布时间】:2014-07-14 10:49:54
【问题描述】:
我有一个 SCons 项目,其中有几个像这样的子目录目标:
project-root
- SConstruct
- Sconscript
+ supportlib
- SConscript (returning library target)
+ src
- ...
+ Program
- SConsctipt (importing library target)
+ src
- ...
注意: supportlib 是一个共享库。
在 Program 子目录中,我像这样链接到 supportlib 目标:
Import( [supportlib] ) # returned from supportlib/Sconscript
env.Append( LIBS=[supportlib] )
这行得通,supportlib 和程序编译和链接。但是supportlib链接到程序的方式是直接引用共享对象而不是-lsupportlib。
伪链接器命令示例:
SCons 就是这样做的:
g++ -o Program/program src/sourcefile1.o src/sourcefile2.o ../supportlib/libsupportlib.so
我想要这个:
g++ -o Program/program src/sourcefile1.o src/sourcefile2.o -L ../supportlib -lsupportlib
为什么?因为通过 SCons 的链接方式,我得到了以下共享库依赖项:
$ ldd program/program
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f867ca03000)
supportlib/libsupportlib.so
我希望依赖项像这样“无路径”:
$ ldd program/program
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f867ca03000)
libsupportlib.so
我可以在不破坏构建依赖关系的情况下使用 SCons 以一种漂亮的方式实现这个目标吗?我知道我可以在我的环境中使用 LINKFLAGS 手动完成,但这不是一个很好的方法,也不是跨平台的,当没有将完整目标传递给 LIBS 时,我猜 SCons 会失去关于构建依赖的知识在 supportlib 和程序之间。
最好的问候 雅各布·西蒙-加德
【问题讨论】: