Inflearn brand logo image

인프런 커뮤니티 질문&답변

김종수님의 프로필 이미지
김종수

작성한 질문수

삼각형의 실전! CMake 초급

CMake 설치

install 추가 질문

작성

·

23

0

안녕하세요?

install 예제 코드를 약간 수정해서 응용해보고 싶습니다. 근데 이 내용을 챗봇들도 잘 몰라서 강사님께 문의드립니다.

 

baz 타겟을 새로 만들고, foo는 baz타겟을 private으로 의존합니다.

baz 타겟은 baz()를 제공하며 foo()와 동일하게 stdout 출력하는 코드입니다.

#include <baz.h>

foo()
{
    cout << "I'm foo!" << endl;
    baz(); // "I'm baz!"
}

 

baz는 foo 내부에서만 사용됩니다. 그래서 demo에는 기존 코드처럼 foo 타겟의 헤더만 제공합니다.

 

제 의도는 I'm foo에 이어 I'm baz도 같이 출력됐으면 했는데, 항상 I'm baz만 출력됩니다.

 

add_library(foo
 foo.cpp
 # baz.cpp
)

챗봇은 foo 타겟 만들 때 baz.cpp도 추가하라고 합니다.

foo, baz 를 명시적으로 분리된 상태에서 CMakeLists.txt에서 작성하고, baz는 foo 내부에서만 사용되니 foo 타겟만 demo 노출해서 사용할 수 있는 방법이 있을까요?

답변 2

0

삼각형님의 프로필 이미지
삼각형
지식공유자

  1. baz 타켓을 만듭니다. 그리고 baz.h와 baz.cpp를 포함시킵니다.

  2. target_link_libraries로 baz를 foo에 PRIVATE으로 연결 시킵니다.

이렇게 하시면될 것 같은데 원하시는 방법이 맞으실까요?

김종수님의 프로필 이미지
김종수
질문자

add_library(baz src/baz.cpp)
target_include_directories(baz PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_link_libraries(foo PRIVATE baz)

...

install(TARGETS foo baz
...
)

install(TARGETS ...)

에서 baz를 삭제하면

image.png


이런 에러가 나오는데요,

CMake Error: install(EXPORT "installing-config" ...) includes target 'foo' 
which requires target 'baz' that is not in any export set. 

 

다시 baz를 추가하면 잘 됩니다.

 

이 패키지(foo + baz) 사용자가 패키지를 포함해서 빌드하려면 foo.lib, baz.lib 모두 필요해서 이런 에러가 발생하는 것 같습니다..

 

install할 때 baz는 private 이고 foo만 public 이니까 baz.lib의 코드들이 foo.lib에 통합되고 foo.lib만 사용자에게 install 통해서 제공될 줄 알았습니다...ㅎㅎ

0

김종수님의 프로필 이미지
김종수
질문자

add_library(baz src/baz.cpp)
target_include_directories(baz PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_link_libraries(foo PRIVATE baz)

...

install(TARGETS foo baz
...
)

baz 타겟을 정의한 다음 install(TARGETS...) 에 baz 타겟을 추가했습니다.

이렇게 하니 install-prefix로 정의한 install 디렉터리 하위에 foo.lib, baz.lib이 생성됐고,

demo를 빌드할 때 baz.lib로 포함되서 실행파일이 만들어지는 것 같습니다. I'm baz 문구 정상적으로 출력됩니다.

이렇게 접근하는 게 맞나요?

삼각형님의 프로필 이미지
삼각형
지식공유자

네 맞습니다. 그리고 barz의 include는 public으로 해주셔야하고요 private은 내부에서 사용하는 헤더만 포함시켜야합니다.

또 install은 최종 실행파일만 하면 자동으로 설치가 될꺼에요. 이건 테스트 해보셔야합니다.

김종수님의 프로필 이미지
김종수

작성한 질문수

질문하기