From 1093e2de22f6ca245b09d758a3510899a8362048 Mon Sep 17 00:00:00 2001 From: Sascha Cunz Date: Fri, 11 May 2012 04:25:23 +0200 Subject: [PATCH] Specifiy dllimport to MSVC if we're not building libgit2.dll Building a "shared object" (DLL) in Windows includes 2 steps: - specify __declspec(dllexport) when building the library itself. MSVC will disallow itself from optimizing these symbols out and reference them in the PE's Exports-Table. Further, a static link library will be generated. This library contains the symbols which are exported via the declsepc above. The __declspec(dllexport) becomes part of the symbol-signature (like parameter types in C++ are 'mangled' into the symbol name, the export specifier is mingled with the name) - specify __declspec(dllimport) when using the library. This again mingles the declspec into the name and declares the function / variable with external linkage. cmake automatically adds -Dgit2_EXPORTS to the compiler arguments when compiling the libgit2 project. The 'git2' is the name specified via PROJECT() in CMakeLists.txt. --- include/git2/common.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/git2/common.h b/include/git2/common.h index 0e9379804..a16cf43d5 100644 --- a/include/git2/common.h +++ b/include/git2/common.h @@ -32,7 +32,11 @@ __attribute__((visibility("default"))) \ type #elif defined(_MSC_VER) -# define GIT_EXTERN(type) __declspec(dllexport) type +# ifdef git2_EXPORTS /* defined by cmake */ +# define GIT_EXTERN(type) __declspec(dllexport) type +# else +# define GIT_EXTERN(type) __declspec(dllimport) type +# endif #else # define GIT_EXTERN(type) extern type #endif