天天看點

靜态連結庫和動态連結庫的編譯靜态連結庫和動态連結庫的編譯

靜态連結庫和動态連結庫的編譯

通常一些第三方通用的開源庫,都能通過預處理宏定義來控制是否編譯為靜态連結庫還是動态連結庫,針對動态連結庫可以控制是否是導出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()