diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-06-02 19:02:17 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-06-02 19:02:17 +0400 |
commit | 732c566f2fb5253c152b81ebbe76eb6a17862046 (patch) | |
tree | f63858393ec3b8f16dd7d9fcf2cfc251eaaf396b | |
parent | 0fa08424b7a78bbf3fd6eb142d477feb0cca9806 (diff) |
Fix #35587: Cycles: image movie to single image crashing
Crash was happening on windows platforms only and was caused
by some specifics about how CRT works.
Basically, blender and all of the .dll are compiled with /MT
flag, which means blender.exe and all .dll are using separate
environments. This makes it impossible to pass file descriptors
from blender to other dll, because it becomes invalid in the dll.
And this is exactly what was happening: OIIO was trying to open
movie file with all known plugins and one of them was zlib. And
the way OIIO was using zlib API is opening the file using Boost
and passing a file descriptor to zlib. And since zlib was a
dynamic library this lead to general issues using this descriptor
in zlib code.
Solved by linking to zlib statically. This allows to safely pass
file descriptor to zlib API. Alternative would be to compile all
the stuff with /MD flag, but that's much bigger and less robust
way to fix the issue.
Tested on windows using msvc2008, scons plus cmake both 32 and 64
bit versions. Seems to be working fine.
Further tweaks for mingw and msvc2012 could be needed tho.
-rw-r--r-- | CMakeLists.txt | 6 | ||||
-rw-r--r-- | SConstruct | 1 | ||||
-rw-r--r-- | build_files/scons/config/linuxcross-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/config/win32-mingw-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/config/win32-vc-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/config/win64-vc-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/tools/Blender.py | 8 | ||||
-rw-r--r-- | source/creator/CMakeLists.txt | 17 |
8 files changed, 9 insertions, 31 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 0379e46bc71..369e7f5b03b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1088,11 +1088,7 @@ elseif(WIN32) set(PNG_LIBPATH ${PNG}/lib) # not cmake defined set(ZLIB_INCLUDE_DIRS ${LIBDIR}/zlib/include) - if(CMAKE_CL_64) - set(ZLIB_LIBRARIES ${LIBDIR}/zlib/lib/libz.lib) - else() - set(ZLIB_LIBRARIES ${LIBDIR}/zlib/lib/zlib.lib) - endif() + set(ZLIB_LIBRARIES ${LIBDIR}/zlib/lib/libz_st.lib) set(PTHREADS_INCLUDE_DIRS ${LIBDIR}/pthreads/include) set(PTHREADS_LIBRARIES ${LIBDIR}/pthreads/lib/pthreadVC2.lib) diff --git a/SConstruct b/SConstruct index 03cfe3ed4ca..c0c505fcc23 100644 --- a/SConstruct +++ b/SConstruct @@ -910,7 +910,6 @@ else: if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'): dllsources = [] - dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll'] # Used when linking to libtiff was dynamic # keep it here until compilation on all platform would be ok # dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll'] diff --git a/build_files/scons/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py index 925ca5bb889..5b958420f37 100644 --- a/build_files/scons/config/linuxcross-config.py +++ b/build_files/scons/config/linuxcross-config.py @@ -78,7 +78,7 @@ BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = LIBDIR + '/zlib' BF_ZLIB_INC = '${BF_ZLIB}/include' -BF_ZLIB_LIB = 'libz' +BF_ZLIB_LIB = 'libz_st' BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib' WITH_BF_INTERNATIONAL = True diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py index be7198713b2..7e1dd3d10cf 100644 --- a/build_files/scons/config/win32-mingw-config.py +++ b/build_files/scons/config/win32-mingw-config.py @@ -78,7 +78,7 @@ BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = LIBDIR + '/zlib' BF_ZLIB_INC = '${BF_ZLIB}/include' -BF_ZLIB_LIB = 'libz' +BF_ZLIB_LIB = 'libz_st' BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib' WITH_BF_INTERNATIONAL = True diff --git a/build_files/scons/config/win32-vc-config.py b/build_files/scons/config/win32-vc-config.py index 955420c42a7..e43bb5336b8 100644 --- a/build_files/scons/config/win32-vc-config.py +++ b/build_files/scons/config/win32-vc-config.py @@ -82,7 +82,7 @@ BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = LIBDIR + '/zlib' BF_ZLIB_INC = '${BF_ZLIB}/include' -BF_ZLIB_LIB = 'libz' +BF_ZLIB_LIB = 'libz_st' BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib' WITH_BF_INTERNATIONAL = True diff --git a/build_files/scons/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py index ff77172b068..eb3533cdb8b 100644 --- a/build_files/scons/config/win64-vc-config.py +++ b/build_files/scons/config/win64-vc-config.py @@ -78,7 +78,7 @@ BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = LIBDIR + '/zlib' BF_ZLIB_INC = '${BF_ZLIB}/include' -BF_ZLIB_LIB = 'libz' +BF_ZLIB_LIB = 'libz_st' BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib' WITH_BF_INTERNATIONAL = True diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py index c5b4494e14f..c6cb88faebc 100644 --- a/build_files/scons/tools/Blender.py +++ b/build_files/scons/tools/Blender.py @@ -155,12 +155,12 @@ def setup_staticlibs(lenv): libincs += Split(lenv['BF_OPENEXR_LIBPATH']) if lenv['WITH_BF_STATICOPENEXR']: statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC']) + if lenv['WITH_BF_ZLIB'] and lenv['WITH_BF_STATICZLIB']: + statlibs += Split(lenv['BF_ZLIB_LIB_STATIC']) if lenv['WITH_BF_TIFF']: libincs += Split(lenv['BF_TIFF_LIBPATH']) if lenv['WITH_BF_STATICTIFF']: statlibs += Split(lenv['BF_TIFF_LIB_STATIC']) - if lenv['WITH_BF_ZLIB'] and lenv['WITH_BF_STATICZLIB']: - statlibs += Split(lenv['BF_ZLIB_LIB_STATIC']) if lenv['WITH_BF_FFTW3']: libincs += Split(lenv['BF_FFTW3_LIBPATH']) if lenv['WITH_BF_STATICFFTW3']: @@ -282,10 +282,10 @@ def setup_syslibs(lenv): if lenv['WITH_BF_OPENEXR'] and not lenv['WITH_BF_STATICOPENEXR']: syslibs += Split(lenv['BF_OPENEXR_LIB']) - if lenv['WITH_BF_TIFF'] and not lenv['WITH_BF_STATICTIFF']: - syslibs += Split(lenv['BF_TIFF_LIB']) if lenv['WITH_BF_ZLIB'] and not lenv['WITH_BF_STATICZLIB']: syslibs += Split(lenv['BF_ZLIB_LIB']) + if lenv['WITH_BF_TIFF'] and not lenv['WITH_BF_STATICTIFF']: + syslibs += Split(lenv['BF_TIFF_LIB']) if lenv['WITH_BF_FFMPEG'] and not lenv['WITH_BF_STATICFFMPEG']: syslibs += Split(lenv['BF_FFMPEG_LIB']) if lenv['WITH_BF_OGG']: diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 1e17d7b7887..7c744d10d63 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -538,23 +538,6 @@ elseif(WIN32) unset(_PYTHON_VERSION_NO_DOTS) endif() - if(CMAKE_CL_64) - # png is statically linked on win64 - install( - FILES ${LIBDIR}/zlib/lib/zlib.dll - DESTINATION ${TARGETDIR} - ) - else() - #not needed since we link statically, maybe also unneeded for MinGW? - if(NOT WITH_MINGW64) - install( - FILES - ${LIBDIR}/zlib/lib/zlib.dll - DESTINATION ${TARGETDIR} - ) - endif() - endif() - if(MSVC) install( FILES ${LIBDIR}/pthreads/lib/pthreadVC2.dll |