CMAKE - 정적 라이브러리의 헤더 파일을 /usr/include에 올바르게 복사하는 방법
C에서 CMAKE를 사용하고 있으며, 실제로는 2개의 매우 작은 정적 라이브러리를 만들고 있습니다.
목표는 다음과 같습니다.
- 라이브러리는 컴파일되어 *.a 파일로 링크됩니다.[이렇게 하면 된다]
- 그리고 그 *.a 파일을 /usr/local/lib [THIS ALSO WORKS]에 복사하고 싶습니다.
- 도서관은 요.
-lnameoflib
컴파일러 플래그입니다. CMakeLists., CMakeLists.를 했습니다. *.a 파일을 txt에 카피합니다./usr/local/lib
사용할 수/usr/local/include
수 이 있어요.#include <mylibheader.h>
지금은 그렇게 알고 있어요.
그리고 CMAKE를 사용하여 헤더 파일을 /usr/include 폴더에 복사하는 적절한 방법은 무엇입니까? 때 좋겠어요.make install
*.a isa 파일처럼
두 라이브러리 모두 비슷한 CMake Lists를 가지고 있습니다.txt:
project(programming-network)
add_library(programming-network STATIC
send_string.c
recv_line.c
)
INSTALL(TARGETS programming-network
DESTINATION "lib"
)
의 cmake를 .PUBLIC_HEADER
★★★★★★ 。
project(myproject)
add_library(mylib some.c another.c)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER "some.h;another.h")
INSTALL(TARGETS mylib
LIBRARY DESTINATION some/libpath
PUBLIC_HEADER DESTINATION some/includepath
)
일부 참조:
는 패턴과 일치하는 모든 파일을 복사하여 디렉토리 구조를 유지합니다.
INSTALL (
DIRECTORY ${CMAKE_SOURCE_DIR}/include/
DESTINATION include
FILES_MATCHING PATTERN "*.h*")
저는 당신의 해결책이 옳다고 생각하지 않습니다. /usr/include
는 벤더가 파일을 저장할 수 있도록 예약되어 있어야 합니다.
이 적절합니다./usr/local/include
다음 합니다.export CPATH="/usr/local/include:${CPATH}"
.
것 같다/usr/local/lib
dir를 하려면 dir를 사용합니다.export LIBRARY_PATH="/usr/local/lib:${LIBRARY_PATH}"
는 .a 바이너리에서도 동일하게 동작합니다(단, OS에 따라서는 공유 라이브러리에서 동작하거나 동작하지 않을 수 있습니다).
더 은, 옵, ,, 운, option, 더, 더를 추가하는 것입니다.-I /usr/local/include
★★★★★★★★★★★★★★★★★」-L /usr/local/lib
컴파일 중.
이것은 다소 주관적인 대답이지만, 나에게는 효과가 있었다.
승인된 답변 외에 많은 라이브러리 및 라이브러리 작성 시set_property
구문을 사용하면 기분이 나빠집니다.다음과 같은 매우 간단한 매크로로 래핑할 수 있습니다.
# File: target_public_headers.cmake
macro(target_public_headers TARGET)
set_target_properties(${TARGET} PROPERTIES PUBLIC_HEADER "${ARGN}")
endmacro()
그런 다음 다음과 같이 사용할 수 있습니다.
project(myproject)
include(target_public_headers)
add_library(mylib some.c another.c)
target_public_headers(mylib some.h another.h) # <<<<<
# If you're exporting this library then you need to tell
# CMake how to include the "installed" version of the headers.
target_include_directories(mylib
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
PUBLIC $<INSTALL_INTERFACE:some/includepath>
)
INSTALL(TARGETS mylib
LIBRARY DESTINATION some/libpath
PUBLIC_HEADER DESTINATION some/includepath
)
몇 년 후 CMake 3.23에서는 퍼블릭헤더에 FILE_SET을 사용할 수 있습니다.
project(programming-network)
add_library(programming-network STATIC)
target_include_directories(programming-network PRIVATE "${PROJECT_SOURCE_DIR}")
target_sources(programming-network
PRIVATE send_string.c recv_line.c
PUBLIC FILE_SET HEADERS
BASE_DIRS ${PROJECT_SOURCE_DIR}
FILES publicheader1.h publicheader2.h)
install(TARGETS programming-network FILE_SET HEADERS)
이제 다음 명령어의 기능을 살펴보겠습니다.
add_library()
, 라이브러리의 , 라이브러리의 , 타겟의 이름, 정적 라이브러리의 경우 STATIC, 공유 라이브러리의 경우 SHARED, 객체의 경우 OBJECT를 정의합니다.target_include_directories()
: 이 행은 프로젝트 디렉토리를 기준으로 서로 참조하는 서브 디렉토리와 개인 헤더가 있는 경우에만 사용할 수 있습니다.그러나 일반적으로 이 명령어는 프로젝트에 외부 헤더를 포함하기 위해 사용됩니다.target_sources()
: 이 명령어는 정의 파일 및 개인 헤더를 추가하기 위해 사용합니다.PRIVATE
키워드를 지정합니다.또, 이것은, 다음의 방법으로 퍼블릭헤더를 추가하기 위해서도 사용됩니다.FILE_SET
키워드를 지정합니다.BASE_DIRS
는 퍼블릭헤더의 절대경로를 상대경로로 변환하는 것으로, 그 경로로부터 베이스 디렉토리를 차감합니다.이 공개 헤더는
/home/someuser/programming-network/sub1/publicheader1.h
의 염기서열로
/home/someuser/programming-network/
에 인스톨 됩니다.
/cmake/install/prefix/include/sub1/publicheader.h
메모target_sources()
에 사용할 수 있다CMakeLists.txt
서브디렉토리에도 대응하고 있습니다.
install()
: 바이너리, 정적/공유 라이브러리 및 공용 헤더를 설치합니다.기본 설치 하위 디렉터리는 다음과 같습니다.bin
,lib
그리고.include
이렇게 변경할 수도 있습니다.
install(TARGETS myTarget
# for executables and dll on Win
RUNTIME DESTINATION bin
# shared libraries
LIBRARY DESTINATION lib
# for static libraries
ARCHIVE DESTINATION lib
# public headers
INCLUDES DESTINATION include)
마지막으로 프로젝트는 (멀티 구성 생성기용: MS Visual C++, Xcode)로 구축 및 설치됩니다.
# in project directory
mkdir build
cd build
cmake ..
cmake --build . --config Release
cmake --install . --prefix "/usr/local/" --config Release
단일 구성 발전기(제조업체, Ninja)의 경우 위의 내용을 삭제하십시오.--config Release
및 cmake ..
로로 합니다.cmake -DCMAKE_BUILD_TYPE=Release ..
.
언급URL : https://stackoverflow.com/questions/10487256/cmake-how-to-properly-copy-static-librarys-header-file-into-usr-include
'programing' 카테고리의 다른 글
null 포인터가 모든 비트0이 아닐 때 C/C++ 코드를 올바르게 쓰는 방법 (0) | 2022.07.06 |
---|---|
구성 요소를 로드하기 전에 VueX 값이 로드될 때까지 기다리십시오. (0) | 2022.07.06 |
기존 JNDI HornetQ 서비스를 HA로 만들기 위한 단계? (0) | 2022.07.06 |
vuetify2를 사용하여 모든 v-card의 높이를 동일하게 하는 방법 (0) | 2022.07.06 |
Vuetify 캘린더 날짜 형식을 변경하는 방법 (0) | 2022.07.06 |