Is there a Linux equivalent of __declspec(dllexport)
notation for explicitly exporting a function from a shared library? For some reason with the toolchain I'm using, functions that aren't class members don't appear in the resulting shared library file.
Explicitly exporting shared library functions in Linux
__attribute__((visibility("default")))
And there is no equivalent of __declspec(dllimport)
to my knowledge.
#if defined(_MSC_VER)
// Microsoft
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#elif defined(__GNUC__)
// GCC
#define EXPORT __attribute__((visibility("default")))
#define IMPORT
#else
// do nothing and hope for the best?
#define EXPORT
#define IMPORT
#pragma warning Unknown dynamic link import/export semantics.
#endif
Typical usage is to define a symbol like MY_LIB_PUBLIC
conditionally define it as either EXPORT
or IMPORT
, based on if the library is currently being compiled or not:
#if MY_LIB_COMPILING
# define MY_LIB_PUBLIC EXPORT
#else
# define MY_LIB_PUBLIC IMPORT
#endif
To use this, you mark your functions and classes like this:
MY_LIB_PUBLIC void foo();
class MY_LIB_PUBLIC some_type
{
// ...
};
A note about where to place the macro would be nice for future readers. –
Bellini
@Bellini Place the macro anywhere before you annotate EXPORT/IMPORT on anything. Most projects will have a specific place in some header where all of their global macros are defined. –
Galvanize
@DanBechard I guess this was related to the position of the macro when using it on a function or class. There are some examples in the GCC Wiki post; rule of thumb: Use it before the return type of a function, and before a class name, e.g.
EXPORT void FunctionName()
and class EXPORT ClassName
. –
Ouidaouija © 2022 - 2024 — McMap. All rights reserved.