Merge pull request #398 from nirbheek/target-link-implib

Re-introduce patch to fix linking with MSVC by linking with import library.
pull/387/merge
Jussi Pakkanen 9 years ago
commit 560d9d7375
  1. 14
      mesonbuild/backend/backends.py
  2. 9
      mesonbuild/environment.py

@ -89,6 +89,14 @@ class Backend():
filename = os.path.join(targetdir, fname)
return filename
def get_target_filename_for_linking(self, target):
# On some platforms (msvc for instance), the file that is used for
# dynamic linking is not the same as the dynamic library itself. This
# file is called an import library, and we want to link against that.
# On platforms where this distinction is not important, the import
# library is the same as the dynamic library itself.
return os.path.join(self.get_target_dir(target), target.get_import_filename())
def get_target_dir(self, target):
if self.environment.coredata.get_builtin_option('layout') == 'mirror':
dirname = target.get_subdir()
@ -267,11 +275,7 @@ class Backend():
if not isinstance(d, build.StaticLibrary) and\
not isinstance(d, build.SharedLibrary):
raise RuntimeError('Tried to link with a non-library target "%s".' % d.get_basename())
fname = self.get_target_filename(d)
if compiler.id == 'msvc':
if fname.endswith('dll'):
fname = fname[:-3] + 'lib'
args.append(fname)
args.append(self.get_target_filename_for_linking(d))
# If you have executable e that links to shared lib s1 that links to shared library s2
# you have to specify s2 as well as s1 when linking e even if e does not directly use
# s2. Gcc handles this case fine but Clang does not for some reason. Thus we need to

@ -98,7 +98,12 @@ class Environment():
if (not cross and mesonlib.is_windows()) \
or (cross and self.cross_info.has_host() and self.cross_info.config['host_machine']['system'] == 'windows'):
self.exe_suffix = 'exe'
self.import_lib_suffix = 'lib'
if self.detect_c_compiler(cross).get_id() == 'msvc':
self.import_lib_suffix = 'lib'
else:
# MinGW-GCC doesn't generate and can't link with a .lib
# It uses the DLL file as the import library
self.import_lib_suffix = 'dll'
self.shared_lib_suffix = 'dll'
self.shared_lib_prefix = ''
self.static_lib_suffix = 'lib'
@ -546,7 +551,7 @@ class Environment():
def get_exe_suffix(self):
return self.exe_suffix
# On Windows the library has suffix dll
# On Windows (MSVC) the library has suffix dll
# but you link against a file that has suffix lib.
def get_import_lib_suffix(self):
return self.import_lib_suffix

Loading…
Cancel
Save