메신져로 얘기했는데.. 혹 다른사람을 위해서 답변올려놓습니다.
앞에 올린답변은 C++빌더6.0 Pro 에서만 테스트 한것이었습니다.
기타 다른 버젼에서는 Test를 못했었는데 빌더2007에서
Package를 컴파일할때 또 다른 문제가 생기네요
지식이 짧아 정확한 이유에 대해 설명은 잘 못하겠지만..
패키지 프로젝트에 보면
Requires 라는 항목이 있습니다.
패키지를 만들때 디폴트로 rtl.bpi 가 Add되어있습니다.
빌더6에서는 vcl관련 (화면에 보이는 함수 및 컨트롤) 함수를 쓰면
vcl.bpi를 add할까라고 물어보던에...
빌더2007에서는 물어보지 않더군요
빌더 2007에서 패키지를 만들어서 Build with runtime package로 쓰려면
Requires에 vcl.bpi를 Add하면 컴파일에 에러가 나지 않더군요
패키지 관련해서 잘모르는데...
혹 누군가가 비슷한 문제가 봉착했을때 힌트라도 되라고 올려봅니다.
그럼..
크레브 님이 쓰신 글 :
: 샘플 프로젝트와
: 씨++빌더 2007 에러 캡쳐 입니다.
:
: 장성호 님이 쓰신 글 :
: : build withd runtime package 에 bpl_sub를 포함하지 않고 테스트를 했었네요..
: :
: : 새로운 package(xxx.bpk) 를 만들어서 Testfunc2.pas 파일을 add해서 테스트 해봤습니다.
: :
: : 1. xxx.bpk를 install한후에
: : 2. test.exe의 옵션 build withd runtime package 에 xxx 를 포함하고
: : 3. 컴파일 및 실행하니 잘되더라구요
: :
: : 그래서 xxx패키지의 test.hpp 파일을 열어서 확인해 보니 ...
: :
: : 기존에 TestFunc.h와 다른것이 있다면
: :
: : 1. namespace 가 선언되어있었구
: : 2. 또하나 extern으로 함수선언하는 부분에서 PACKAGE라는 옵션이 추가되어 있네요
: :
: : 아래처럼
: :
: :
: : namespace Testfunc2
: : {
: : //-- type declarations -------------------------------------------------------
: : //-- var, const, procedure ---------------------------------------------------
: : extern PACKAGE bool __fastcall ShowMsg2(AnsiString s);
: :
: : } /* namespace Testfunc2 */
: : using namespace Testfunc2;
: :
: :
: :
: :
: : namespace가 상관있는 줄았알는데...
: : namespace는 상관이 없고 PACKAGE라는것이 상관이 있네요
: :
: : extern하고 함수 선언할때 PACKAGE 라는것을 추가하면 문제가 해결되는네요
: :
: :
: : extern PACKAGE bool __fastcall ShowMsg2(AnsiString s);
: :
: :
: :
: : 다시 bpl을 수정한뒤에
: :
: : test.exe를 탐색기에서 바로 실행해도 수정된 것이 적용되었습니다.
: :
: :
: : 그럼..
: :
: :
: : 크레브 님이 쓰신 글 :
: : : 우선 답변 감사합니다.
: : : 하지만 저도 bpl 프로젝트와 테스트 프로젝트를 다른 폴더에서 테스트 해봤습니다만
: : : 동일한 에러가 발생합니다.
: : :
: : : 혹시 장성호님은 Runtime Package를 체크 안하셨거나
: : : runtime package 리스트에 bpl_sub 를 추가 안하신건 아닌지요?
: : :
: : : 제대로 된다면 dll 처럼 실행파일 재컴파일 없이 ShowMessage의 내용을
: : : bpl만 다시 컴파일 해서 바꿀수 있어야 하는건데
: : : 잘되십니까?
: : :
: : : 잘되신다면 테스트 프로젝트를 좀 올려주셨으면 합니다.
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : bpl을 별로 만들어 보지 않아서 정확히 설명을 못하겠지만...
: : : :
: : : : 님이 올려주신 package 를 install하여서 test프로그램 돌려 보니까
: : : : 잘 되는데요
: : : :
: : : : 단,
: : : : test프로그램을 bpl 패키지와 같은 폴더가 아니라
: : : : 다른 폴더에 copy해서 컴파일 했습니다.
: : : :
: : : : link할때
: : : :
: : : : 같은 폴더에 xxx.h 파일이 있는경우 bpl에서 함수를 링크하려하기 보다
: : : : 같은 폴더에 xxx.obj 파일을 찾아 링크하려 하는게 우선인지...
: : : :
: : : : 하여간 잘 몰라서 정확히 설명은 못하고 의견만...
: : : :
: : : : 그럼..
: : : :
: : : :
: : : : 크레브 님이 쓰신 글 :
: : : : : 일단 하려고 한 목표는 bpl에 폼을 넣어서 사용하려고 합니다.
: : : : : dll에 폼을 넣어서 사용하는 방법은 많이 써봤는데
: : : : : bpl 에 넣어서 사용하면 편리하다는 얘기가 많이 있어서 테스트 해봤습니다.
: : : : : 그러나 역시 한번에 되는 것은 없군요 쩝..
: : : : : 에러 하나때문에.. OTL
: : : : :
: : : : : 패키지 프로젝트를 새로 만들어서
: : : : : 일단 함수로 테스트 해보려고 다음과 같이 유닛을 넣었습니다.
: : : : : [[ TestFunc.cpp ]]
: : : : :
: : : : : #include
: : : : : #pragma hdrstop
: : : : :
: : : : : #include "TestFunc.h"
: : : : :
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : #pragma package(smart_init)
: : : : :
: : : : :
: : : : : bool ShowMsg(AnsiString sMsg)
: : : : : {
: : : : : ShowMessage(sMsg);
: : : : : return true;
: : : : : }
: : : : :
: : : : :
: : : : :
: : : : : 다음에 테스트용 프로젝트를 새로 만들어서
: : : : : "TestFunc.h" 를 인클루드 하고 ShowMsg를 호출해봤습니다.
: : : : : [[ Main.cpp ]]
: : : : :
: : : : :
: : : : : #include
: : : : : #pragma hdrstop
: : : : :
: : : : : #include "Main.h"
: : : : : #include "TestFunc.h"
: : : : :
: : : : : //---------------------------------------------------------------------------
: : : : : #pragma package(smart_init)
: : : : : #pragma resource "*.dfm"
: : : : : TForm1 *Form1;
: : : : : //---------------------------------------------------------------------------
: : : : : __fastcall TForm1::TForm1(TComponent* Owner)
: : : : : : TForm(Owner)
: : : : : {
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : : {
: : : : : ShowMsg("test");
: : : : : }
: : : : : //----
: : : : :
: : : : :
: : : : : 옵션에서 Runtime Package을 껐을때는
: : : : : 아무 문제 없는데...
: : : : : 옵션을 켜고 Runtime Package 내용에 bpl_sub(bpl 파일이름)을 추가하고
: : : : : 하면 ShowMsg를 찾을 수 없다는 링크 에러가 발생합니다.
: : : : :
: : : : : [[ 테스트 프로젝트 옵션 ]]
: : : : :
: : : : :
: : : : : [[ 에러 ]]
: : : : :
: : : : :
: : : : :
: : : : : 일반 Dll 만들때는 함수 선언시 __declspec(dllexport) 를 사용하는데..
: : : : : 이것을 선언 안해서 그런것인지 모르겠습니다.
: : : : : bpl에서도 똑같이 선언해야 하는것인지요?
: : : : :
: : : : : 하지만,,, 그렇게 해도 문제가 있습니다.
: : : : : 그렇게 선언하면 패키지 프로젝트를 빌드 할때
: : : : : TestFunc.cpp의 ShowMsg 함수안헤서 ShowMessage() VCL 함수 사용한 부분에서 링크에러가 발생하는군요
: : : : : 함수의 소스에서 VCL 관련 부분 건드리면 다 링크 에러가 발생하네요
: : : : :
: : : : : 패키지 프로젝트로 콤포넌트 외에 일반 runtime용 라이브러리(dll 대용)를 만들거나
: : : : : 폼을 포함시키는 용도로 사용하는 방법에 대한 조언 바랍니다.
: : : : : 간단한 샘플 만들어 주시면 더 고맙겠습니다. ^^