강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của peterkim
peterkim

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

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

Viết

·

70

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++cmakevcpkg

Câu trả lời 2

0

triangle님의 프로필 이미지
triangle
Người chia sẻ kiến thức

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

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

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

peterkim님의 프로필 이미지
peterkim
Người đặt câu hỏi

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님의 프로필 이미지
peterkim
Người đặt câu hỏi

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

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

triangle님의 프로필 이미지
triangle
Người chia sẻ kiến thức

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

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

Hình ảnh hồ sơ của peterkim
peterkim

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

Đặt câu hỏi