[Scons-users] Problem with DLL dependencies on Windows

Dirk Bächle tshortik at gmx.de
Sat May 25 05:49:01 EDT 2013


Dmitry,

I finally found some time to look into your example, and I think I know
what's going on now.

On 24.05.2013 10:41, Dmitry Mikhin wrote:

> Hello Dirk,

>

>> [...]

>> The *.a file and the *.dll file should both appear in the list of targets

>> for your DLL. You can test this by printing them to stdout:

>>

>> t = env.SharedLibrary(...)

>> print "My targets:", map(str, t)

> Yes, they do:

> My targets: ['utils.dll', 'libutils.a']


The fact that both libraries appear as output targets, proves that the
MinGW toolchain is doing its job just fine. Also the 'lib/SConscript'
directly uses the created target nodes for the LIBS variable, such that
SCons finds them and they get properly registered as dependencies for
the final executable.

But in the 'prog/SConscript' you declare the LIBS variable as

libs = ['utils']

only. This means that SCons then tries to find a library with the name
stem 'utils' in the set of defined Nodes, and it uses the Environment
variables 'LIBPREFIXES' and 'LIBSUFFIXES' for this. Under Windows, these
two get initialized to

LIBPREFIXES = ['$LIBPREFIX'] # meaning 'lib'
LIBSUFFIXES = ['$LIBSUFFIX'] # meaning '.a'

, respectively.

This is why only the 'libutils.a' gets found for your second program.
You can confirm this with the '--debug=findlibs' option, as suggested by
Jason Kenny.

I currently have the following two solutions for this:

1.) Either you propagate the target nodes for the 'utils' lib from one
SConscript to the other as

# in lib\SConscript
utils = ...
Export('utils')

# in prog\SConscript
Import('utils')
libs = utils

2.) or, you allow the library finder to search for .DLL files as well,
by adding

env.Append(LIBPREFIXES = ['$SHLIBPREFIX'])
env.Append(LIBSUFFIXES = ['$SHLIBSUFFIX'])

while constructing the main Environment in your top-level SConstruct.

Best regards,

Dirk



More information about the Scons-users mailing list