항상 최소 필수 버전을 지정하십시오. cmake
cmake_minimum_required(VERSION 3.9)
프로젝트를 선언해야합니다. cmake
이 필수이며 편리 변수를 정의 것이라고 PROJECT_NAME
, PROJECT_VERSION
그리고 PROJECT_DESCRIPTION
(3.9 cmake이 후자의 변수 필요로) :
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)
라이브러리의 공개 API를 선언하십시오. 이 API는 타사 응용 프로그램 용으로 설치됩니다. 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
(자세한 내용은 pc (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
cmake에게 형식의 변수를 확장하지 않도록 요청하십시오 ${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)