HDK
|
Go to the source code of this file.
Macros | |
#define | OIIO_IMPORT __attribute__((visibility("default"))) |
#define | OIIO_EXPORT __attribute__((visibility("default"))) |
#define | OIIO_LOCAL __attribute__((visibility("hidden"))) |
#define | OIIO_API OIIO_IMPORT |
#define | OIIO_UTIL_API OIIO_IMPORT |
#define | OIIOC_API OIIO_IMPORT |
Macros necessary for proper symbol export from dynamic libraries.
Definition in file export.h.
#define OIIO_API OIIO_IMPORT |
#define OIIO_EXPORT __attribute__((visibility("default"))) |
#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
#define OIIO_LOCAL __attribute__((visibility("hidden"))) |
#define OIIO_UTIL_API OIIO_IMPORT |
#define OIIOC_API OIIO_IMPORT |