아직 미완성! 틀린 부분 있으면 댓글 바람!!


CMake의 경우 인터넷에 영어든 한글이든 자료가 없거나, 추상적이게 설명하여 이해가 어렵다. 쉽게 말해서 좆빠진다.


 그래서 나는 VSCode CMakeTools확장의 힘을 빌려 

"CMake를 이렇게 작성하면?, 

1.내부적으로, 결과적으로 "이렇게" 컴파일 되고, 

2.코드 내부에서 "이렇게" 인텔리센스가 작동한다." 

식으로 설명할 것이다.

 그리고 최대한 동의이음어는 찾아내 수정하고 있으니 봐줬으면 좋겠다.

(라이브러리라고 나오면 "정적라이브러리"인 "프로젝트"라고 생각하고, 헤더는 .h .hpp 파일을 의미하는 거라고 생각해.

사실 프로젝트가 exe,lib.dll 뭐든 상관없이 적용되는 내용이긴 해.)


 프로젝트의 "정보"란 대표적으로 어떤 "경로 또는 헤더"를 인클루드 했는지, 어떤 컴파일 옵션을 쓰는지, 이 두가지가 전부 라고 봐도 좋다. (매우 주관적이지만 적어도 나는 부족함 없었음.)

그리고"정보 전달"은 정보가 "전달 당한" 프로젝트가 "전달한" 프로젝트의 옵션이 더해져 적용된다는 것, 즉 전달한 프로젝트의 인텔리센스와 컴파일 옵션이 그대로 "추가"된다.


@ target_link_libraries()의 한정자(범위를 한정시키는 글자)인, PUBLIC/PRIVATE/INTERFACE 은 무엇인가?


이제부터 

한정자들을,

PUBLIC은 P

PRIVATE는 V

INTERFACE는 I

이다.


(라이브러리 만드는) 프로젝트 A,B,C,D,E가 있다.

add_library(A STATIC "${CURRENT_PATH}/v1.cpp")
add_library(B STATIC "${CURRENT_PATH}/v2.cpp")
add_library(C STATIC "${CURRENT_PATH}/v3.cpp")
add_library(D STATIC "${CURRENT_PATH}/v4.cpp")
add_library(E STATIC "${CURRENT_PATH}/v5.cpp")

target_include_directories("A" PUBLIC "${CURRENT_PATH}/header1")
target_include_directories("B" PUBLIC "${CURRENT_PATH}/header2")
target_include_directories("C" PUBLIC "${CURRENT_PATH}/header3")
target_include_directories("D" PUBLIC "${CURRENT_PATH}/header4")
target_include_directories("E" PUBLIC "${CURRENT_PATH}/header5")

target_link_libraries("B" PUBLIC A)
target_link_libraries("C" PUBLIC B)
target_link_libraries("D" PUBLIC C)
target_link_libraries("E" PUBLIC D)

 이때 target_include_directories의 PUBLIC키워드는 target_link_libraries했을 때, 정보 전달을 반드시 막지 "는" 않겠다는 뜻이다.

( PRIVATE의 경우, 프로젝트를 참조하는 프로젝트로의 정보 전달이 원천 차단된다. 그리고 자기 프로젝트의 코드 내에서만 인클루드 정보에 접근 가능 하다. 하지만 한 헤더가 두 개 이상의 프로젝트에서 인클루드 될 경우 그 프로젝트들의 인클루드 정보의 교집합이 헤더의 인클루드 정보가 된다.)

 이제 참조를 트리로 그리면,



 이때 선 사이사이의 P는 옵션으로 적은 한정자이고 알파벳 A~E는 프로젝트이자 프로젝트간 정보 전달 관계, 알파벳 

아래의 PA~PE에서 왼쪽은 프로젝트 정보의 상태, 오른쪽은 어떤 프로젝트의 정보인지 말한다. 

예) PA는 PUBLIC 상태의 A의 정보.


 정보의 상태에 따라 자신이 접근할 수 있는 정보가 달라진다. 위 그림에서 C의 경우,

B, A, C 정보에 접근 가능하다. (자기 자신의 정보는 반드시 항상 접근 가능하다.)

 만약 자신이 가진 정보의 상태가 I일 경우 정보에 접근할 수 없으며 나머지 P, V 상태는 접근할 수 있다.

정보의 상태는 어떤 한정자를 만나느냐에 따라 달라지는데, 각각

(X는 전달되지 않음.)

P한정자  P->P    I->P    V->X

I한정자   P->I     I->I     V->X 

V한정자  P->V    I->V    V->X

인데 예를 보도록 하자.


 (V상태의 정보는 자신을 참조하는 프로젝트로 전달되지 않아.)

위 그림을 기반으로, 프로젝트별 참조 가능한 프로젝트들의 정보를 목록으로 정리하면

프로젝트/정보ABCDE
Aoxxxx
Booxxx
Cxxoxx
Dxooox
Exxxxo