programing

CMAKE - 정적 라이브러리의 헤더 파일을 /usr/include에 올바르게 복사하는 방법

nicescript 2022. 7. 6. 22:19
반응형

CMAKE - 정적 라이브러리의 헤더 파일을 /usr/include에 올바르게 복사하는 방법

C에서 CMAKE를 사용하고 있으며, 실제로는 2개의 매우 작은 정적 라이브러리를 만들고 있습니다.

목표는 다음과 같습니다.

  1. 라이브러리는 컴파일되어 *.a 파일로 링크됩니다.[이렇게 하면 된다]
  2. 그리고 그 *.a 파일을 /usr/local/lib [THIS ALSO WORKS]에 복사하고 싶습니다.
  3. 도서관은 요.-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
)

일부 참조:

PUBLIC_HEADER

CMake install 명령어

는 패턴과 일치하는 모든 파일을 복사하여 디렉토리 구조를 유지합니다.

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 Releasecmake ..로로 합니다.cmake -DCMAKE_BUILD_TYPE=Release ...

언급URL : https://stackoverflow.com/questions/10487256/cmake-how-to-properly-copy-static-librarys-header-file-into-usr-include

반응형