QnA에 쓰려고 하다가 여기에다 써 봅니다.
저는 프로젝트를 할 때 한개의 Project에서 모든 소스를 포함시켜서 프로그래밍을 하는 스타일이 아니고
static library로 구분을 해서 프로그램을 작성하는 편입니다.
계속 프로젝트를 하는데 있어서 불편한 점이 있어서 몇자 적어 봅니다.
다음과 같이 프로젝트 파일을 구성합니다.
main.groupproj : 그룹 프로젝트
main.cbproj : main.exe를 만들어 내는 exe 프로젝트
main.cpp
mylib.cbproj : my.lib 를 만들어 내는 라이브러리 프로젝트
mylib.cpp
이런 구조라 가정합니다.
main.exe를 빌드하기 위해서 mylib.lib를 같이 링크하는 구조이고
당연히 main.cbproj에서 mylib.cbproj의 dependency를 걸어 줍니다.
여기에서 문제점
1. dependency를 줬는데도 불구하고 main.exe를 빌드하는데 있어서 링크 에러가 난다(mylib.lib 를 명시적으로 main.cbproj에 추기시켜 줘야 한다. 기본 폴더가 Debug, Release로 구분되기 때문에 어떤 lib를 링크시켜 줘야 하는지를 Debug, Release 빌드를 전환할 때마다 계속 바꿔 줘야 한다).
2. mylib.cpp가 변경된 이후에 Make(F9)를 하면 mylib.lib만 변경되고 main.exe는 변경되지 않는다. 이 때문에 mylib.cpp를 고치고 나서 main.cpp의 한바이트를 수정해 주는 불필요한 작업을 계속 하게 된다.
3. Debug, Release모드에 대한 출력 파일명을 따로 구분할 수가 없어서 불편함이 있다(static library를 타사에 납품할 때 불편하다).
2번때문에 한창 고생했던 기억이 나네요.
본 문제에 대해서 본사에서는 어떻게 처리하고 있는지가 궁금합니다.
사용하고 있는 버전은 CodeGear C++ Builder (C++Builder 2007) 버전입니다.
|
exe 프로젝트를 make 시키면 다시 link 하지 않는 것은 조금 아쉬운 부분인 것 같습니다.
아마도 빌더개발자들이 개발시 그다지 신경쓰이지 않는 부분이라고 생각하지 않았나 모르겠습니다.
보통 빌더는 VC와 달리 Debug/Release 모드의 실행화일과 LIB 화일에 별반 차이가 없습니다.
하지만 개발자가 디버그 모드인 경우만 동작하는 디버그 코드를 넣어 두는 일이 많이 있습니다.
그래서 Debug/Release 모드간의 결과물에 대한 구분이 필요한 경우도 많은 것 같습니다.
이를 프로젝트 설정에서 지정하면 좋은데, 프로젝트 매니저에서 바로 구분해서 지정할 수 있게 되어 있지 않습니다.
그냥 프로젝트에 특정한 lib 를 포함하게는 되는데, 이 경우는 lib 의 rebuild를 제대로 인식하기 때문에
make 시키면 lib 가 변경되었다고 다시 link하게 되니 괜잖지만,
문제는 Debug/Release 모드 구분해서 각각의 상태에 맞는 lib를 링크할 수 없다는데 있습니다.
다시 링크하려면 이경문님처럼 소스에 빈칸을 넣는다던지 또는 ALT+F9로 강제 컴파일을 한뒤 make하면 됩니다.
Debug/Release 모드간의 링크 라이브러리 구분은
#ifdef _DEBUG
#pragma link "../lib/debug/alib.lib"
#else
#pragma link "../lib/release/alib.lib"
#endif
이런 식으로 코드내에 간단히 처리할 수 있습니다.
이를 빈 unit 하나 생성해서 집어 넣어 두고
lib 가 변경된 경우 이 빈 unit을 alt+f9로 재컴파일해주고 make(ctrl+f9) 하면
필요한 라이브러리가 링크되닌까
이 정도로 개발한다면 그다지 불편하지 않을 것 같네요.
Debug/Release 모드간 결과물에 조금 차이는 있어도 일반적으로 프로토타입은 같으닌까
Lib 프로토타입 Include 파일은 같이 써도 별다른 문제는 없지 않나 싶습니다.
댓글 몇줄 적으려고 미리 아는 내용이긴 해도 빌더2007 올려서 간단히 테스트해 해봤습니다. ^^;