All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
export.h File Reference
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.


#define OIIO_IMPORT   __attribute__((visibility("default")))
#define OIIO_EXPORT   __attribute__((visibility("default")))
#define OIIO_LOCAL   __attribute__((visibility("hidden")))

Detailed Description

Macros necessary for proper symbol export from dynamic libraries.

Definition in file export.h.

Macro Definition Documentation


Definition at line 65 of file export.h.

#define OIIO_EXPORT   __attribute__((visibility("default")))

Definition at line 58 of file export.h.

#define OIIO_IMPORT   __attribute__((visibility("default")))

On Windows, when compiling code that will end up in a DLL, symbols must be marked as 'exported' (i.e. __declspec(dllexport)) or they won't be visible to programs linking against the DLL.

In addition, when compiling the application code that calls the DLL, if a routine is marked as 'imported' (i.e. __declspec(dllimport)), the compiler can be smart about eliminating a level of calling indirection. But you DON'T want to use __declspec(dllimport) when calling a function from within its own DLL (it will still compile correctly, just not with maximal efficiency). Which is quite the dilemma since the same header file is used by both the library and its clients. Sheesh!

But on Linux/OSX as well, we want to only have the DSO export the symbols we designate as the public interface. So we link with -fvisibility=hidden to default to hiding the symbols. See http://gcc.gnu.org/wiki/Visibility

We solve this awful mess by defining these macros:

OIIO_API - used for the OpenImageIO public API. Normally, assumes that it's being seen by a client of the library, and therefore declare as 'imported'. But if OpenImageIO_EXPORT is defined (as is done by CMake when compiling the library itself), change the declaration to 'exported'. OIIO_EXPORT - explicitly exports a symbol that isn't part of the public API but still needs to be visible. OIIO_LOCAL - explicitly hides a symbol that might otherwise be exported

Definition at line 57 of file export.h.

#define OIIO_LOCAL   __attribute__((visibility("hidden")))

Definition at line 59 of file export.h.


Definition at line 71 of file export.h.


Definition at line 77 of file export.h.