[cairo] _cairo_win32_tmpfile()
Mohit Sindhwani
ml3p at onghu.com
Sun Sep 28 07:44:05 PDT 2008
Augusto Radtke wrote:
>> That's indeed very untested. You mean, if CAIRO_WIN32_STATIC_BUILD is defined
>> we should define cairo_public to nothing? That makes sense, does this work
>> better:
>>
>> #ifndef cairo_public
>> # if _MSC_VER && ! CAIRO_WIN32_STATIC_BUILD
>> # define cairo_public __declspec(dllimport)
>> # else
>> # define cairo_public
>> # endif
>> #endif
>>
>
> It's getting better, but there is another issue, we should use
> __declspec(dllexport) when building a DLL. I can't found yet a way to
> make that work without some define at some point of the process, like
> CAIRO_WIN32_STATIC_BUILD, this is how I solved the problem internally
> on my software:
>
> #if defined(_WIN32)
> #if defined(SCULLY_API_EXPORT)
> #define SCULLY_API __declspec(dllexport)
> #elif defined(SCULLY_API_IMPORT)
> #define SCULLY_API __declspec(dllimport)
> #else
> #define SCULLY_API
> #endif
> #else
> #if defined(SCULLY_API_IMPORT)
> #define SCULLY_API extern
> #else
> #define SCULLY_API
> #endif
> #endif
>
> The default here it's to build statically, so if I'm building
> statically I don't have to define nothing on either points (library
> compilation and library usage by third party). If I'm not compiling
> statically I define SCULLY_API_EXPORT when compiling the library and
> SCULLY_API_IMPORT on using the library headers. I believe cairo as
> open-source it's mostly used as an external library instead of being
> building statically, so it should stand for a different default:
>
> #ifndef cairo_public
> #if _MSC_VER && CAIRO_WIN32_BUILD_DLL
> #define cairo_public __declspec(dllexport)
> #elif _MSC_VER && !CAIRO_WIN32_BUILD_DLL
> #define cairo_public __declspec(dllimport)
> #elif CAIRO_WIN32_BUILD_DLL
> #define cairo_public extern
> #else
> #define cairo_public
> #endif
> #endif
>
> That means that we should always build cairo with
> CAIRO_WIN32_BUILD_DLL set if we are building a DLL, but the person
> using that DLL can go direct to #include <cairo.h> without caring
> about any magic define. Also if the person want a static build of
> cairo it can build directly and use directly without magic define. The
> responsibility of setting correct defines goes to the DLL builder. The
> extern defined on the second #elif is to people building a DLL on GCC,
> does it use extern as somekind of __declspec(dllexport)? This is
> something I need some light from someone else.
>
> Augusto
Augusto
I may be missing something in your email, but would this help? We use
this in some of our software:
#ifdef __dll__
#define IMPEXP __declspec(dllexport)
#else
#define IMPEXP __declspec(dllimport)
#endif // __dll__
Of course, this means that you should definitely do a conditional define
__dll__ in your DLL build projects.
Cheers,
Mohit.
9/28/2008 | 10:44 PM.
More information about the cairo
mailing list