靜态連結庫和動态連結庫的編譯
通常一些第三方通用的開源庫,都能通過預處理宏定義來控制是否編譯為靜态連結庫還是動态連結庫,針對動态連結庫可以控制是否是導出API還是導入API。
示例
#ifdef LIBASYNC_STATIC //是否編譯靜态連結庫
# define LIBASYNC_EXPORT
#else //編譯動态連結庫
# ifdef _WIN32 //window平台
# ifdef LIBASYNC_BUILD //是否定義導入導出函數
# define LIBASYNC_EXPORT __declspec(dllexport)
# else
# define LIBASYNC_EXPORT __declspec(dllimport)
# endif
# else //其他平台
# define LIBASYNC_EXPORT __attribute__((visibility("default")))
# define LIBASYNC_EXPORT_EXCEPTION __attribute__((visibility("default")))
# endif
#endif
編譯靜态連結庫
target_compile_definitions(Async++ PUBLIC LIBASYNC_STATIC) //建構靜态連結庫
隻需定義預處理宏
LIBASYNC_STATIC
即可。
編譯動态連結庫
不用定義預處理宏
LIBASYNC_STATIC
的同時,還需定義宏
LIBASYNC_BUILD
來實作在庫的内部和外部都能使用API。
set_target_properties(Async++ PROPERTIES DEFINE_SYMBOL LIBASYNC_BUILD)//設定動态連結庫導入導出符号
CMakeLists
set_target_properties(Async++ PROPERTIES DEFINE_SYMBOL LIBASYNC_BUILD)//設定動态連結庫導入導出符号
if (BUILD_SHARED_LIBS) //是否建構動态連結庫
# Minimize the set of symbols exported by libraries
else()
target_compile_definitions(Async++ PUBLIC LIBASYNC_STATIC) //建構靜态連結庫
endif()