개발 프로젝트에 참여해 공통 모듈을 작성할 경우, 확장자 obj 또는 lib로 파일을 제공하여 사용하는 방법과 c/c++소스를 제공하여 사용하는 방법의 차이에 대해서 소개합니다.
obj 파일에 대해서
obj 파일은 c/c++파일을 컴파일해서 생성되는 실행할 수 없는 바이너리 파일입니다. main 함수 없이는 그저 중간파일에 지나지 않아, exe 실행파일이 될 수 없습니다. 힘들게 개발한 c/c++ 소스를 공개하고 싶지 않다면 obj 파일과 h(헤더) 파일, 그리고 함수 설명서만 제공할 수 있습니다.
따라하기
다음과 같이 정적 라이브러리(.lib)의 빈 프로젝트(testobj)를 만들고 나눗셈 함수(divide)를 포함한 sample.c파일을 작성하여 빈 프로젝트(testobj)에 추가합니다.
sample.c
#include <stdio.h>
int divide(int x, int y) {
return x / y;
}
정적 라이브러리(.lib) 프로젝트를 위한 빌드(컴파일 + 라이브러리 작성) 대신에 다음과 같이 대상 파일에서 마우스 오른쪽 버튼 클릭으로 콘텍스트 메뉴를 표시해, 컴파일(M)만을 실행합니다.
컴파일만 실행하면 다음과 같이 sample.obj 파일이 작성됩니다. obj 파일은 실행 파일이 아닙니다. 다음 장(.lib확장자 파일에 대해서)의 정적 라이브러리(.lib)를 만들기 위한 obj 파일이거나, main함수 프로그램에서 참조되어 링크 명령으로 어플리케이션(.exe)을 만들기 위한 obj 파일입니다.
다음은 컴파일만으로 생성된 파일 일람입니다.
C:\mysol\testobj>tree . /F
폴더 PATH의 목록입니다.
볼륨 일련 번호가 000000E1 6E17:7C4F입니다.
C:\MYSOL\TESTOBJ
│ sample.c
│ testobj.vcxproj
│ ... 중간 생략 ...
└─x64
└─Debug
│ sample.obj
│ ... 중간 생략 ...
└─testobj.tlog
... 중간 생략 ...
lib 파일에 대해서
여러 개의 c파일을 각각 obj 파일로 컴파일 하고, 이렇게 생성된 obj 파일들을 라이브러리 작성 명령으로 하나로 합쳐서 생성된, 실행할 수 없는 바이너리 파일이 lib 파일입니다. obj확장자 파일과 동일하게 c/c++소스를 공개하고 싶지 않다면 lib 파일과 h(헤더) 파일, 함수 설명서만 제공할 수 있습니다.
따라하기
다음과 같이 정적 라이브러리(.lib)의 빈 프로젝트(testlib)를 만들어 common1.c와 common2.c를 작성해서 빈 프로젝트(testlib)에 추가합니다.
common1.c
int add(int x, int y) {
return x + y;
}
common2.c
int multiply(int x, int y) {
return x * y;
}
정적 라이브러리(.lib) 프로젝트의 빌드(컴파일 + 라이브러리 작성) 또는 다시 빌드를 실행하여 testlib.lib를 작성합니다.
다음 그림과 같습니다.
다음은 빌드(컴파일 + 라이브러리 작성)로 생성된 파일 목록입니다.
C:\mysol\testlib>tree . /F
폴더 PATH의 목록입니다.
볼륨 일련 번호가 0000009D 6E17:7C4F입니다.
C:\MYSOL\TESTLIB
│ common1.c
│ common2.c
│ testlib.vcxproj
│ ... 중간 생략 ...
└─x64
└─Debug
│ common1.obj
│ common2.obj
│ testlib.lib
│ ... 중간 생략 ...
└─testlib.tlog
... 중간 생략 ...
외부 함수 참조하는 실행 파일 작성
main함수, 참조 함수가 동일 파일 안에 있는 경우
소스 코드에 main() 함수가 존재하고 main() 함수로 부터 실행 되는 minus 함수가 main 함수 앞에 선언 되어 있다면 빌드(컴파일 + 링크)로 exe 실행 파일로 만들 수 있습니다.
빌드를 위한 프로젝트 testprj의 구성은 다음과 같습니다.
sample.c
#include <stdio.h>
int minus(int x, int y) {
return x - y;
}
int main(int argc, char* argv[]) {
printf("Hello World\n\r");
printf("3-2=%d", minus(3 , 2));
return 0;
}
main에 대해서는 [C언어 실행 파일 작성에서 main함수의 역할 VS C/C++]를 참조 하십시오.
프로젝트 testprj의 속성은 다음과 같습니다.
C:\mysol\testprj>tree . /F
폴더 PATH의 목록입니다.
볼륨 일련 번호가 000000D8 6E17:7C4F입니다.
C:\MYSOL\TESTPRJ
│ sample.c
│ testprj.vcxproj
│ testprj.vcxproj.filters
│ ... 중간 생략 ...
└─x64
└─Debug
│ sample.obj
│ testprj.exe
│ ... 중간 생략 ...
└─testprj.tlog
... 중간 생략 ...
외부 참조 함수가 다른 프로젝트 소스에 있는 경우
exe 실행 파일을 만들기 위해 소스를 작성할 때 다른 프로젝트의 있는 소스를 사용하는 방법에는 다음의 두가지가 있습니다.
소스를 복사해서 가져오기
다른 프로젝트의 소스를 복사해서 가져온다면 같은 파일을 2중으로 관리해야 합니다. 예를 들어 버그가 발생해서 수정할 필요가 있다면 두 프로젝트의 각각의 파일을 수정하거나 한 곳을 수정한 뒤, 복사해서 가져와야 합니다. 그리고 물론 두 프로젝트를 전부 빌드(컴파일 + 링크) 해야합니다. 소스를 복사해서 가져오는 방법은 다음과 같습니다.
- C:\mysol\testlib\common1.c를 C:\mysol\testprj\common1.c로 파일을 복사합니다.
- 복사한 결과는 다음과 같습니다.
- [프로젝트 > 소스파일 > 추가 > 기족항목(G)]을 선택하여 복사한 소스를 다음과 같이 프로젝트에 추가합니다.
- C:\mysol\testlib\common1.c를 C:\mysol\testprj\common1.c로 파일 복사를 하고 기존항목으로 testprj프로젝트에 추가한 결과는 다음과 같습니다.
소스를 참조해서 컴파일하기
다른 프로젝트의 소스를 참조하여 추가할 수 있습니다. 물리적으로 파일을 복사하지 않습니다. 소스가 수정되면 참조되는 전 프로젝트는 다시 빌드(컴파일 + 링크) 해야 합니다. 절차는 다음과 같습니다.
- 참조 복사 대상 파일을 선택해서 마우스 오른쪽 버튼으로 콘텍스트 메뉴의 복사를 선택합니다.
- 참조 사용을 하고자 하는 프로젝트의 소스 파일을 선택해서 마우스 오른쪽 버튼으로 콘텍스트 메뉴의 붙여넣기를 선택합니다.
- 다음과 같이 testprj 프로젝트에 common1.c 소스가 추가되었지만 파일을 열어 경로를 확인하면 C:\mysol\testlib경로에 common1.c파일이 저장되어 있음을 확인할 수 있습니다.
- 다음과 같이 참조 컴파일에서는 C:\mysol\testprj에서 common1.c 파일을 찾을 수 없습니다.
- 지금까지의 [소스를 참조해서 컴파일하기]를 하나의 그림으로 정리하면 다음과 같습니다.
외부 참조 함수가 다른 프로젝트의 obj 파일에 있는 경우
외부 참조 함수가 포함되어 있는 obj 파일을 링커를 이용하여 참조할 수 있습니다. 절차는 다음과 같습니다.
- testprj 속성 페이지를 표시하기 위해 프로젝트 testprj를 선택해서 마우스 오른쪽 버튼으로 콘텍스트 메뉴의 [속성(R)]을 선택합니다.
- testprj 속성 페이지에서 [링커] – [일반]을 선택하고 추가 라이브러리 디렉토리 입력 상자에 ..\testlib\$(Platform)\$(Configuration)를 추가합니다. 추가 내용은 ..\testlib\x64\Debug와 같습니다..
- testprj 속성 페이지에서 [링커] – [입력]을 선택하고 추가 종속성 입력 상자에 참조 함수가 포함되어 있는 common1.obj를 추가합니다.
- 위의 내용을 하나의 그림으로 정리하면 다음과 같습니다.
외부 참조 함수가 다른 프로젝트의 lib파일에 있는 경우
외부 참조 함수가 포함되어 있는 lib 파일을 링커를 이용하여 참조할 수 있습니다. 절차는 다음과 같습니다.
- testprj 속성 페이지를 표시하기 위해 프로젝트 testprj를 선택해서 마우스 오른쪽 버튼으로 콘텍스트 메뉴의 [속성(R)]을 선택합니다.
- testprj 속성 페이지에서 [링커] – [일반]을 선택하고 추가 라이브러리 디렉토리 입력 상자에 ..\testlib\$(Platform)\$(Configuration)를 추가합니다. 추가 내용은 ..\testlib\x64\Debug와 같습니다..
- testprj 속성 페이지에서 [링커] – [입력]을 선택하고 추가 종속성 입력 상자에 참조 함수가 포함되어 있는 testlib.lib를 추가합니다.
- 위의 내용을 하나의 그림으로 정리하면 다음과 같습니다.