inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Tam giác đang hoạt động! CMake cho người mới bắt đầu

Cài đặt CMake

install 추가 질문

Đã giải quyết

90

peterkim

8 câu hỏi đã được viết

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 노출해서 사용할 수 있는 방법이 있을까요?

c++ cmake vcpkg

Câu trả lời 2

0

triangle

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

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

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

0

peterkim

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

peterkim

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 문구 정상적으로 출력됩니다.

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

0

triangle

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

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

실행 방법 질문

0

68

1

CMake Error: Unknown argument --fresh

0

66

1

질문

0

54

2

set(<variable> ON/OFF)와 option에 차이가 있을까요?

0

65

2

-와 _를 선택하는 규칙이 궁금합니다.

0

71

2

4강과 5강의 강의 순서가 바뀐 것 같습니다.

0

68

2

-G 명령으로 Xcode 생성 할때 오류가 발생합니다.

0

156

2

Build_SHARED_LIBS 질문

0

152

2

수업 진행 중에 궁금한 부분이 생겼습니다.

0

186

2

설치경로 지정이 잘 안돼요.

0

154

1

FetchContent로 가져온 외부 라이브러리를 사전에 빌드하는 방법이 있을까요?

0

246

2

ExternalProject_Add 관련 질문

0

268

2

FetchContent를 캐시 처리할 수 있나요?

0

147

1

CMake 커맨드 - target_include_directories 질문

0

200

2

병렬 동작 지원 여부

1

267

2

CMake 의 단점들

0

238

1

CMake 출시 연도가 영상에서 아마도 잘못 소개된 것 같습니다

0

177

1

4-2 installing 에서 질문드립니다

0

229

2

CheckIncludeFileCXX 모듈 질문

0

197

1

혹시 강의에 나오는 예제 코드를 받을 수 있는건가요?

0

280

1

CMake 배포 강의가 CMake 설치 강의랑 똑같아요

0

486

1

Xcode 빌드시스템 에서 빌드가 잘 되지 않는 문제가 있습니다.

0

1276

1

CMake 심화 - CMake 설치 실습 관련 문제

0

770

3

CMakeCache.txt에서 ON과 1은 같은건가요?

0

313

1