हमेशा का न्यूनतम आवश्यक संस्करण निर्दिष्ट करें cmake
cmake_minimum_required(VERSION 3.9)
आपको एक प्रोजेक्ट घोषित करना चाहिए। cmake
यह अनिवार्य है और यह सुविधाजनक चर को परिभाषित करेगा PROJECT_NAME
, PROJECT_VERSION
और PROJECT_DESCRIPTION
(यह बाद वाला चर cmake 3.9 की आवश्यकता है):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
एक नया पुस्तकालय लक्ष्य घोषित करें। कृपया के उपयोग से बचें file(GLOB ...)
। यह सुविधा संकलन प्रक्रिया में भाग लेने में निपुणता प्रदान नहीं करती है। यदि आप आलसी हैं, तो कॉपी-पेस्ट आउटपुट ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
VERSION
संपत्ति सेट करें (वैकल्पिक लेकिन यह एक अच्छा अभ्यास है):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
आप SOVERSION
बड़ी संख्या में भी सेट कर सकते हैं VERSION
। तो libmylib.so.1
एक सहानुभूति होगी libmylib.so.1.0.0
।
set_target_properties(mylib PROPERTIES SOVERSION 1)
अपने पुस्तकालय के सार्वजनिक एपीआई की घोषणा करें। यह एपीआई तीसरे पक्ष के आवेदन के लिए स्थापित किया जाएगा। अपने प्रोजेक्ट ट्री में इसे अलग करना एक अच्छा अभ्यास है include/
। ध्यान दें कि, निजी हेडर स्थापित नहीं किए जाने चाहिए और मैं उन्हें स्रोत फ़ाइलों के साथ रखने का दृढ़ता से सुझाव देता हूं।
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
यदि आप उपनिर्देशिका के साथ काम करते हैं, तो रिश्तेदार पथ जैसे शामिल करना बहुत सुविधाजनक नहीं है "../include/mylib.h"
। इसलिए, शामिल निर्देशिकाओं में एक शीर्ष निर्देशिका पास करें:
target_include_directories(mylib PRIVATE .)
या
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
अपने पुस्तकालय के लिए एक स्थापित नियम बनाएँ। मेरा सुझाव है कि CMAKE_INSTALL_*DIR
में परिभाषित चर का उपयोग करें GNUInstallDirs
:
include(GNUInstallDirs)
और स्थापित करने के लिए फ़ाइलें घोषित करें:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
आप pkg-config
फ़ाइल निर्यात भी कर सकते हैं । यह फ़ाइल आपके पुस्तकालय को आसानी से आयात करने के लिए तीसरे पक्ष के आवेदन की अनुमति देती है:
नाम की एक टेम्प्लेट फ़ाइल बनाएं mylib.pc.in
( अधिक जानकारी के लिए पीसी (5) मैनपेज देखें):
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
अपने में CMakeLists.txt
, @
मैक्रोज़ का विस्तार करने के लिए एक नियम जोड़ें ( @ONLY
फॉर्म के वेरिएबल्स का विस्तार न करने के लिए पूछें ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
और अंत में, जनरेट की गई फ़ाइल इंस्टॉल करें:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
आप cmake EXPORT
फीचर का भी इस्तेमाल कर सकते हैं । हालांकि, यह सुविधा केवल संगत है cmake
और मुझे इसका उपयोग करना मुश्किल है।
अंत में पूरा CMakeLists.txt
दिखना चाहिए:
cmake_minimum_required(VERSION 3.9)
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
include(GNUInstallDirs)
add_library(mylib SHARED src/mylib.c)
set_target_properties(mylib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER api/mylib.h)
configure_file(mylib.pc.in mylib.pc @ONLY)
target_include_directories(mylib PRIVATE .)
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)