From c057d29192ec80b10ffdc122e1975b31b4d907c7 Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Mon, 18 Dec 2017 21:51:33 +0900 Subject: [PATCH] fix compilation error on Visual Studio 2013 and earlier - fix compilation error about "inline" - fix linker error about "_TIFF_snprintf_f" --- 3rdparty/libtiff/CMakeLists.txt | 45 +++++++++++++++++++---------------------- 3rdparty/libtiff/snprintf.c | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 24 deletions(-) create mode 100644 3rdparty/libtiff/snprintf.c diff --git a/3rdparty/libtiff/CMakeLists.txt b/3rdparty/libtiff/CMakeLists.txt index 11ae3df..f996e08 100644 --- a/3rdparty/libtiff/CMakeLists.txt +++ b/3rdparty/libtiff/CMakeLists.txt @@ -34,31 +34,27 @@ if(NOT MSVC) check_include_file(unistd.h HAVE_UNISTD_H) endif() -if(MSVC) - set(INLINE_KEYWORD "inline") -else() - # Inspired from /usr/share/autoconf/autoconf/c.m4 - foreach(inline_keyword "inline" "__inline__" "__inline") - if(NOT DEFINED C_INLINE) - set(CMAKE_REQUIRED_DEFINITIONS_SAVE ${CMAKE_REQUIRED_DEFINITIONS}) - set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} - "-Dinline=${inline_keyword}") - check_c_source_compiles(" - typedef int foo_t; - static inline foo_t static_foo() {return 0;} - foo_t foo(){return 0;} - int main(int argc, char *argv[]) {return 0;}" - C_HAS_${inline_keyword}) - set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_SAVE}) - if(C_HAS_${inline_keyword}) - set(C_INLINE TRUE) - set(INLINE_KEYWORD "${inline_keyword}") - endif() - endif() - endforeach() +# Inspired from /usr/share/autoconf/autoconf/c.m4 +foreach(inline_keyword "inline" "__inline__" "__inline") if(NOT DEFINED C_INLINE) - set(INLINE_KEYWORD) - endif() + set(CMAKE_REQUIRED_DEFINITIONS_SAVE ${CMAKE_REQUIRED_DEFINITIONS}) + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + "-Dinline=${inline_keyword}") + check_c_source_compiles(" + typedef int foo_t; + static inline foo_t static_foo() {return 0;} + foo_t foo(){return 0;} + int main(int argc, char *argv[]) {return 0;}" + C_HAS_${inline_keyword}) + set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS_SAVE}) + if(C_HAS_${inline_keyword}) + set(C_INLINE TRUE) + set(INLINE_KEYWORD "${inline_keyword}") + endif() + endif() +endforeach() +if(NOT DEFINED C_INLINE) + set(INLINE_KEYWORD) endif() @@ -413,6 +409,7 @@ set(lib_srcs tif_write.c tif_zip.c tif_stream.cxx + snprintf.c t4.h tif_dir.h tif_fax3.h diff --git a/3rdparty/libtiff/snprintf.c b/3rdparty/libtiff/snprintf.c new file mode 100644 index 0000000..c46a6a8 --- /dev/null +++ b/3rdparty/libtiff/snprintf.c @@ -0,0 +1,38 @@ +/** + * Workaround for lack of snprintf(3) in Visual Studio. See + * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010/8712996#8712996 + * It's a trivial wrapper around the builtin _vsnprintf_s and + * _vscprintf functions. + */ + +#ifdef _MSC_VER + +#include +#include + +int _TIFF_vsnprintf_f(char* str, size_t size, const char* format, va_list ap) +{ + int count = -1; + + if (size != 0) + count = _vsnprintf_s(str, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + + return count; +} + +int _TIFF_snprintf_f(char* str, size_t size, const char* format, ...) +{ + int count; + va_list ap; + + va_start(ap, format); + count = vsnprintf(str, size, format, ap); + va_end(ap); + + return count; +} + +#endif // _MSC_VER + -- 2.7.4