작성
·
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
baz 타켓을 만듭니다. 그리고 baz.h와 baz.cpp를 포함시킵니다.
target_link_libraries로 baz를 foo에 PRIVATE으로 연결 시킵니다.
이렇게 하시면될 것 같은데 원하시는 방법이 맞으실까요?
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은 최종 실행파일만 하면 자동으로 설치가 될꺼에요. 이건 테스트 해보셔야합니다.
install(TARGETS ...)
에서 baz를 삭제하면
이런 에러가 나오는데요,
다시 baz를 추가하면 잘 됩니다.
이 패키지(foo + baz) 사용자가 패키지를 포함해서 빌드하려면 foo.lib, baz.lib 모두 필요해서 이런 에러가 발생하는 것 같습니다..
install할 때 baz는 private 이고 foo만 public 이니까 baz.lib의 코드들이 foo.lib에 통합되고 foo.lib만 사용자에게 install 통해서 제공될 줄 알았습니다...ㅎㅎ