演示源碼下載地址: https://github.com/mohistH/demo_cmake_dylib
把文僅為參考。 以實際情況為准
1、目錄結構
│ CMakeLists.txt
│ index.txt
│
├─build
├─include
│ hello.h
│ hi.h
│
└─src
hello.cxx
hi.cxx
2、CMakeLists.txt
cmake_minimum_required(VERSION 3.1) #項目名 project(libhello) # 1、指定庫的目錄變量 set(libhello_src src/hello.cxx) # 指定頭文件搜索路徑 include_directories("${PROJECT_SOURCE_DIR}/include") # 2、添加庫(對應的兩個項目) add_library( hello_shared SHARED ${libhello_src}) add_library( hello_static STATIC ${libhello_src}) # 按照一般的習慣,靜態庫名字跟動態庫名字應該是一致的,只是擴展名不同; # 即:靜態庫名為 libhello.a; 動態庫名為libhello.so ; # 所以,希望 "hello_static" 在輸出時,不是"hello_static",而是以"hello"的名字顯示,故設置如下 # SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello") # 3、cmake在構建一個新的target時,會嘗試清理掉其他使用這個名字的庫, # 因此,在構建libhello.a時,就會清理掉libhello.so. # 為了回避這個問題,比如再次使用SET_TARGET_PROPERTIES定義 CLEAN_DIRECT_OUTPUT屬性。 SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) SET_TARGET_PROPERTIES (hello_shared PROPERTIES CLEAN_DIRECT_OUTPUT 1) # 4、按照規則,動態庫是應該包含一個版本號的, # VERSION指代動態庫版本,SOVERSION指代API版本。 SET_TARGET_PROPERTIES (hello_static PROPERTIES VERSION 1.1 SOVERSION 1) SET_TARGET_PROPERTIES (hello_shared PROPERTIES VERSION 1.1 SOVERSION 1) # 5、若將libhello.a, libhello.so.x以及hello.h安裝到系統目錄,才能真正讓其他人開發使用, # 本例中,將hello的共享庫安裝到<prefix>/lib目錄; # 將hello.h安裝<prefix>/include/hello目錄。 #INSTALL (TARGETS hello hello_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #INSTALL (FILES hello.h DESTINATION include/hello)
3、configure and generate
xxx/to/path cd build cmake ..
4、截圖:
mac沒有電了, 來個Windows10的截圖吧:
5、其他設置
若需要指定輸出路徑,嘗試下面的示例指令:
# 設置VS會自動新建Debug和Release文件夾 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin) # 設置分別設置Debug和Release輸出目錄 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../../build/Debug) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/Bin)