작성
·
1.6K
답변 3
2
답변 정말루 감사드립니다. 강의도 잘 보고있읍니다.
그런데 제 질문의 요지와 약간 어긋난 답변을 주신 것 같습니다. 아니면 제가 아직 이해를 잘 못하고있던가요 ㅠㅠ...
첫 번째 질문에 대해서는,
왜 라이브러리 파일과 헤더 파일 둘 다를 포함해야 하느냐는 질문이 아닌,
왜 프로젝트 속성 -> 구성속성 ->VC++ 디렉터리 의 라이브러리 디렉터리 를 통해 라이브러리 경로를 알려줬는데, #pragma comment(lib, "Engine.lib") 문장을 통해 라이브러리 경로를 또 알려주어야 하는지? 에 대한 질문이었습니다.
제가 이해하기론 위 두 과정을 모두 수행해야만 제대로 빌드 되는 것 같은데, 제가 뭔가 잘못 이해하고 있는건가요?
그리고 두 번째 질문에 대해서는 그냥 단순히 두 방법이 완전히 같은 기능을 한다고 이해하면 될까요?
0
0
Engine.lib은 실행되어야 하는 코드들이 들어간 일종의 바이너리 파일입니다. (exe처럼)
그런데 C++의 빌드 과정을 생각해보면,
모든 cpp 파일들이 독립적으로 빌드되면서 obj파일로 만들어지고
이를 최종적으로 링크 단계에서 합쳐서 결과물을 만드는데요.
A.cpp에서 B.h에 들어가 있는 함수를 호출한다면, #include "B.h"를 합니다.
왜냐하면 해당 함수의 자세한 내용은 모르더라도
함수의 시그니처는 알아야 정상적으로 코드를 만들어줄 수 있기 때문입니다.
(스택 프레임 구성 원리를 생각해보면, 그럴 수 밖에 없죠)
그리고 해당 함수의 자세한 코드들은 B.cpp가 빌드되면서 만들어지겠죠.
결과적으로 헤더파일의 역할과 바이너리의 역할이 구분되는 것처럼
결과물에 해당하는 lib파일 말고도 헤더 파일들을 알아야 할 필요가 있습니다.
C++ 컴파일 단계는 조금 복잡하게 되어 있으니
깊이 이해할 필요는 없고 그냥 공식처럼 사용해도 무방합니다.
헤더나 라이브러리 파일 위치를 알려주는 방법은 여러가지인데
어떤 것을 사용하더라도 무방합니다.
아 죄송합니다~ 질문을 잘못 이해했네요.
VS 설정에서 우리가 잡아주는 라이브러리 디렉터리 경로는
[해당 경로에 있는 모든 라이브러리 파일을 사용한다]가 아니라
[이 위치에서 라이브러리 파일들을 찾아보겠다]에 가깝습니다.
#pragma comment(lib, "Engine.lib")
그리고 위 아이는 Engine.lib을 사용하겠다는 의미입니다.
Engine.lib을 사용하는건 맞는데 그게 어디 있는지는 지정한 적 없는데,
컴파일러가 위에서 잡아준 경로들을 하나씩 스캔해보면서 Engine.lib을 찾게 됩니다.
따라서 둘다 해주는게 맞구요.
코드상에서 #pragma comment(lib)을 사용하지 않고 직접 프로젝트 설정에 가서
[링커->입력->추가 족속성] 쪽에 수동으로 Engine.lib을 추가해줄 수도 있긴 합니다.
그리고 lib 경로를 알려주는 2 방법 중 무엇을 사용해도 결과는 동일합니다.
(하나는 /LIB 하나는 /LIBPATH를 설정하는 것이라 서칭 시점이 다를텐데 크게 중요하지 않습니다)