[CMake] Proper way to export a library
Matthew Woehlke
matthew.woehlke at kitware.com
Thu Oct 31 11:52:24 EDT 2013
On 2013-10-31 05:26, Cyrille Faucheux wrote:
> Can you tell me a bit more about "implicit compile flags [...] for imported
> tagets"?
See documentation on target_compile_definitions.
> On the library I'm currently working on, with Visual Studio, I have to
> declare some compile definition in order to get the proper
> "__declspec(dllimport)" or "__declspec(dllexport)" defined (or not defined
> when compiling/using a static version of this library).
This sounds like you're doing it wrong.
When building with CMake, the preferred way is to unconditionally define
an ABI export symbol via a header which exists for that purpose (e.g.
config.h, my_package_exports.h, etc.). The value of the definition
however is conditional on a symbol that is only defined when building
the library, to choose between import and export as appropriate.
Even better, CMake will define <target>_EXPORTS for you when building a
library, so you shouldn't need to manually specify any definitions at all.
IOW you libraries headers would somewhere contain:
#if defined(_WIN32)
# define MYPROJECT_ABI_EXPORT __declspec(dllexport)
# define MYPROJECT_ABI_IMPORT __declspec(dllimport)
#elif __GNUC__ >= 4
# define MYPROJECT_ABI_EXPORT __attribute__ ((visibility("default")))
# define MYPROJECT_ABI_IMPORT __attribute__ ((visibility("default")))
#else
# define MYPROJECT_ABI_EXPORT
# define MYPROJECT_ABI_IMPORT
#endif
...and:
#ifdef mylibrary_EXPORTS
# define MYLIBRARY_EXPORT MYPROJECT_ABI_EXPORT
#else
# define MYLIBRARY_EXPORT MYPROJECT_ABI_IMPORT
#endif
That said...
> Does "implicit compile flags" means that those compile definition could be
> automatically declared by the imported target?
...this was my understanding of how target_compile_definitions(PUBLIC)
is supposed to work. (Note: I haven't actually used this feature myself
yet.)
--
Matthew
More information about the CMake
mailing list