Commit 1093e2de22f6ca245b09d758a3510899a8362048

Sascha Cunz 2012-05-11T04:25:23

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
diff --git a/include/git2/common.h b/include/git2/common.h
index 0e93798..a16cf43 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