델파이.컨설턴트 님이 쓰신 글 :
: 델파이 컨설턴트로 일하고 있는 사람입니다.
: System.pas는 델파이와 C++빌더에서 심장 역할을 하는 중요한 코드입니다.
: 개발자들이 참고하라고 소스만 공개해주고 있을 뿐입니다.
: System.pas는 엠베카데로 내부 엔지니어들 아니면 컴파일 하는게 불가능 합니다.
:
:
:
:
: cubase 님이 쓰신 글 :
: : 안녕하세요
: : RAD XE2 사용하고 있습니다. System.pas 소스 수정해서 컴파일해야 하는데 별짓 다해봐도 컴파일이 안되네요
: :
: : 처음에 System.pas 파일명으로 컴파일이 안되길래 파일명을 _System.pas로 하니까 컴파일이 되는듯 하더니
: : 이번에는 이런 에러가 뜹니다
: :
: : [DCC Error] _System.pas(312): E2572 RTTI visibility set constant expression of type System.TRttiVisibility
: : expected.
: :
: : 큐베이스라는 음악제작 프로그램에서 플럭인 만들려고 하는데 DSP 연산 처리에 문제가 있어서 찾아 보니까
: : C++빌더에서 사용할 땐 코프로세서를 패치해줘야 한다고 하더군요.
: :
: : System.pas 라인넘버 31830 부분의 코드를
: :
: : [수정전]
: :
: : _InitializeControlWord;
: : _FpuInit();
: :
: : TTextRec(Input).Mode := fmClosed;
: : TTextRec(Output).Mode := fmClosed;
: : TTextRec(ErrOutput).Mode := fmClosed;
: :
: :
: : [수정후]
: :
: : _InitializeControlWord;
: : _FpuInit();
: :
: : int patch = 0x33f;
: :
: : OutputDebugString('co-processor patched...');
: : asm
: : {
: : FNINIT
: : FWAIT
: : FLDCW [patch]
: : }
: : TTextRec(Input).Mode := fmClosed;
: : TTextRec(Output).Mode := fmClosed;
: : TTextRec(ErrOutput).Mode := fmClosed;
: :
: : 저렇게 수정해서 컴파일 해야하는데 방법이 없을까요. 컴파일해서 VCL 라이브러리 파일을 바꿔서 사용해야
: : 하는데 도움 좀 부탁드리겠습니다. OutputDebugString은 System.pas가 패치가 됐나 확인차 필요합니다.
: : 고수님님들 도와주세요.
답변:
프로그래밍 처음 시작하는 학생 같았으면 굳이 이런 말 할 필요도 없었을 텐데, 한마디 안할 수가 없네요.
데놓고 자칭 "델파이.컨설턴트"라고 하는 사람이 그렇게 근거도 없는 글을 함부로 올려도 되는 겁니까.
누가 컴파일이 불가능하다고 합디까. --;
: :
: : _InitializeControlWord;
: : _FpuInit();
: :
: : int patch = 0x33f;
: :
: : OutputDebugString('co-processor patched...');
: : asm
: : {
: : FNINIT
: : FWAIT
: : FLDCW [patch]
: : }
: : TTextRec(Input).Mode := fmClosed;
: : TTextRec(Output).Mode := fmClosed;
: : TTextRec(ErrOutput).Mode := fmClosed;
위와 같이 수정하면 Co-Processor를 초기화 해버려서 RTL 프레임웍을 사용하는 데 문제가 발생할 수 있습니다.
(Default8087CW 라는 내부 변수가 사용되고 있음) 그래서 소스를 아래와 같은 식으로 수정해서 컴파일 했으니까
참고하세요.
<System.pas> 수정된 소스
_InitializeControlWord;
_FpuInit();
OutputDebugString('=====================================');
OutputDebugString(' [PATCH] : coprocessor patched....');
OutputDebugString('=====================================');
// Patch CoProcessor
asm
mov ax, Default8087CW
or ax, $33F
mov Default8087CW, ax
fldcw Default8087CW
fwait
end;
TTextRec(Input).Mode := fmClosed;
TTextRec(Output).Mode := fmClosed;
TTextRec(ErrOutput).Mode := fmClosed;
...
Embarcadero 에서 제공하는 라이브러리를 교체해 버릴 수도 있지만, 오히려 필요할 때만 링크해서 사용할 수 있게
obj 파일로 관리하는게 더 편리할 겁니다. 소스를 수정해서 컴파일한 System.obj 파일을 첨부하니까 필요한 프로젝트
에 다음과 같이 링크만 걸어주면 됩니다.
...
컴파일해서 실행하면 RAD XE2 IDE 개발환경의 Event Log에 아래와 같은 식으로 OutputDebugString 메세지가
출력되는 것을 확인할 수 있을 겁니다.
...
질문에 언급되어있는 내용으로 봐선 Runtime Package대신 static 라이브러리를 사용하는 것 같은데. 맞죠.
Dynamic RTL, Delphi RTL, Runtime Package 옵션 사용하지 말고 컴파일 하세요.
...