C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[15681] 라이브러리 연계하여 컴파일할 때 문제점.
이경문 [gilgil] 5431 읽음    2009-02-12 22:55
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) 버전입니다.
김태선 [cppbuilder]   2009-02-13 01:44 X
dependency를 설정하더라도 개발자에 의한 lib 의 업데이트 사실을 인지 하지 못해
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 올려서 간단히 테스트해 해봤습니다. ^^;
김태선 [cppbuilder]   2009-02-13 01:53 X
아마도 빌더의 프로젝트 옵션을 Debug/Release 모드간에 적절히 처리하면 lib 변경에 따른 자동 make가 되게 할수도 있지도 않나 싶은데 그것까지는 연구를 못해 봤습니다.
망치 [mangchy]   2009-02-13 10:30 X
저도 스태틱으로 쓸때는 위에 김태선님처럼 #if #else를 써서 합니다.
요즘은 dll을 만들어서 동적으로 로딩하는 편입니다. 디버그 모드냐에 따라서 dll을 로딩하는 경로도 틀려지겠죠...
dll에서 함수명이나 프로토타입이 바뀌지 않는한 dll만 컴파일하면 되기때문이죠...
이경문 [gilgil]   2009-02-13 11:17 X
아, 답변 감사합니다.
저도 김태선님 말씀처럼 하고 싶은데
상용으로 판매하는 lib 파일을 별도의 폴더에서 넣어서 제공하기가 좀 거시기하거든요.
*_debug.lib *_release.lib 파일을 하나의 폴더에서 한꺼번에 제공하고 싶은데... 쩝...
Lyn [tohnokanna]   2009-02-13 11:17 X
전 Output 폴더를 강제 지정해서 처리를 하고.
2번은 습관적으로 Build All 을 하는 스타일이라 =_=;; 고생 해본 기억이 없네요 -0-;
Lyn [tohnokanna]   2009-02-13 11:23 X
음.. 판매하는 lib 라... 그럼  김태선님 말씀처럼


#ifdef _DEBUG
#pragma link "../lib/debug.lib"
#else
#pragma link "../lib/release.lib"
#endif

로 해도 될거같은데요..
박지훈.임프 [cbuilder]   2009-02-13 11:23 X
To 경문...

3번 문제는 2007 이후에서 추가된 PostBuild 기능을 사용하면 어떻게 될 거 같은데, 어제 밤에 잠깐 해보니 조건을 어떻게 줘야할지가 좀 애매하두만. 시간 날 때 좀 더 알아보려구 한다.

우리가 회사를 런칭한지가 아직 얼마 안되어서 엠바카데로/코드기어 본사와의 커뮤니케이션이 원활치 않아.
하지만 기회가 되면 되도록 빨리 요청해볼께.
이경문 [gilgil]   2009-02-13 11:29 X
Lyn님 / 출력 파일명은 변경할 수가 없는데 Final Output을 같이 주게 되면 lib 파일이 overwrite됩니다. ㅠㅠ
박지훈님 / 네, Post Build를 어떻게 하면 될 거 같은데, 명령어를 일일이 기억할 수도 없고, static library 만들때마다 세팅하는 것도 좀 귀찮고, 본사에 feedback 좀 주시면 정말 감사하겠습니다. 지금 어떻게 프로그램을 짜느냐 하면 static library를 한창 만들고 테스트할 때에는 Visual Studio로 만들고, 나중에 UI 붙일 때 C++Builder를 사용하고 있습니다. ㅠㅠ
이경문 [gilgil]   2009-02-13 11:30 X
온라인상이라서 존댓말 씁니다. ㅎㅎ
Lyn [tohnokanna]   2009-02-13 11:52 X
PostBuild 에서 이름을 바꿔도 괜찮을 것 같네요 : )
박지훈.임프 [cbuilder]   2009-02-13 14:52 X
PostBuild를 써서 이름을 바꾸는 것 자체는 잘 됩니다.
프로젝트 옵션의 PostBuild 입력란에 다음과 같이 두 줄을 입력하면 되죠.

del $(OUTPUTDIR)$(OUTPUTNAME)$_debug$(OUTPUTEXT)
ren $(OUTPUTDIR)$(OUTPUTNAME)$(OUTPUTEXT) $(OUTPUTNAME)$_debug$(OUTPUTEXT)

이렇게 지정해두면 프로젝트의 원래 아웃풋이 Project1.exe일 경우 컴파일할 때마다 자동으로 Project1_debug.exe로 리네임됩니다.

그런데 PostBuild 설정에서 디버그 모드와 릴리즈 모드를 구별할 조건을 주는 것이 까다로워서 마지막까지 성공은 못한 거죠.
이경문 [gilgil]   2009-02-17 14:28 X
윽. Post-Build가 Debug, Release구분을 하지 않는군요. ㅠㅠ

+ -

관련 글 리스트
15681 라이브러리 연계하여 컴파일할 때 문제점. 이경문 5431 2009/02/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.