Realize 클래스 프로시저가 정의되지 않았습니다.
저는 제가 어떻게 그 오류에 대한 해결책을 찾았는지를 공유하고 싶습니다.
Realize 클래스 프로시저가 정의되지 않았습니다.
X/Motif C 애플리케이션을 실행할 때.온라인 검색 중에 이 문제에 대한 참조가 하나만 발견되었고 해결책이 없어 이 글을 올립니다.
문제를 해결할 수 있었고, 이 문제를 다시 발견할 경우 결과를 공유하고 싶었습니다(참고:제 솔루션이 항상 이런 유형의 오류를 해결할 것이라고 말하는 것은 아닙니다.
문제
모티프와 X 고유의 툴킷을 사용한 간단한 C 프로그램을 실행하다가 이 문제를 발견했습니다.
$ gcc -Wall -c push.c
$ gcc -Wall -o push push.o -lXt -lXm
$ ./push
Error: No realize class procedure defined
C 소스 코드는 다음과 같습니다.
#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/PushB.h>
/* Prototype Callback function */
void pushed_fn(Widget, XtPointer, XmPushButtonCallbackStruct *);
int main(int argc, char **argv)
{
Widget top_wid, button;
XtAppContext app;
Display* display;
XtToolkitInitialize();
app = XtCreateApplicationContext();
display = XtOpenDisplay(app, "localhost:10.0","push","push", NULL,0, &argc,argv);
top_wid = XtAppCreateShell(NULL, "Form", applicationShellWidgetClass, display, NULL, 0);
button = XmCreatePushButton(top_wid, "Push_me", NULL, 0);
/* tell Xt to manage button */
XtManageChild(button);
/* attach fn to widget */
XtAddCallback(button, XmNactivateCallback, (XtCallbackProc) pushed_fn, NULL);
XtRealizeWidget(top_wid); /* display widget hierarchy */
XtAppMainLoop(app); /* enter processing loop */
return 0;
}
void pushed_fn(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *cbs)
{
printf("Don't Push Me!!\n");
}
XtRealize 때부터 libXt에 문제가 있을 수 있다고 생각했습니다.위젯 기호가 해당 라이브러리에 정의되어 있습니다.nm를 사용하여 살펴보았지만 모든 것이 양호해 보였습니다.
$ nm -D /usr/lib/libXt.so |grep XtRealizeWidget
02b39870 T XtRealizeWidget
"T"는 libXt 라이브러리를 구성하는 개체 파일의 텍스트(코드) 섹션에 기호가 있음을 의미하므로 이 기호가 정의됩니다.시스템 라이브러리의 경로도 정확했고 libXt의 단일 버전만 있었습니다.
그런 다음 라이브러리가 gcc 링커로 전달되는 순서가 원인일 수 있다고 생각하고 읽기 시작하여 이 스택 오버플로 스레드에 도달했습니다.
라이브러리의 순서를 다음으로 전환한 후:
$ gcc -Wall -o push push.o -lXm -lXt
문제는 해결되었습니다.
라이브러리가 링커로 전달되는 순서에 주의하세요!
마틴 시몬스(Martin Simmons)의 답변(LessTif FAQ에서 발췌):
연결 순서 문제는 다음 두 가지 기호로 인해 발생합니다.
vendorShellClassRec vendorShellWidgetClass
정의되고 참조되는 것은 두 가지 모두입니다.
-lXm
그리고.-lXt
. 어떻게든 링커를 설득해야 사용할 수 있습니다.-lXm
둘 다의 참조를 만족시키기 위한 정의들-lXm
그리고.-lXt
.그-lXt
정의를 사용해서는 안됩니다.일반적인 엘프 기반 동적 로더(Linux, Solaris 등)의 경우, 이것은 다음을 통과함으로써 이루어집니다.'-lXm -lXt'
둘 다 다음과 같이 추가되는 링커에.SO_NEEDED
실행 파일에 대한 섹션입니다.런타임에 동적 로더는 각 로더로부터 심볼을 수집합니다.SO_NEEDED
섹션은 이미 알고 있는 기호를 삭제한 다음 해당 결합된 기호 테이블을 사용하여 로드된 모든 라이브러리의 참조를 수정하는 순서로 정렬합니다.일반적인 정적 링커의 경우 다음을 지정하여 수행하기도 합니다.'-lXm -lXt'
링커에 연결합니다.이 경우 링커는 몇 가지를 추출합니다..o
.-lXm
사용자 referen 기호를 포함하고 있고 결국 추출됩니다.-lXm:Vendor.o
에 대한 내부의 언급으로 인하여-lXm
. 그 다음에는 동일한 작업을 수행합니다.-lXt
, 하지만 추출할 필요는 없습니다.-lXt:Vendor.o
아직도 정의되지 않은 것을 정의하지 않기 때문입니다.
언급URL : https://stackoverflow.com/questions/32373700/no-realize-class-procedure-defined
'programing' 카테고리의 다른 글
jGravity 양식 제출 후 콜백 쿼리 (0) | 2023.10.26 |
---|---|
How to parse time from database (0) | 2023.10.26 |
사이트 간 fetch/axios 요청 시 JSONP 사용 방법 (0) | 2023.10.26 |
Excel VSTO 플러그인에서 행을 조롱하는 방법? (0) | 2023.10.26 |
연락처 양식 7을 사용하여 워드프레스에서 제출할 FontAwesome 아이콘을 추가하는 방법? (0) | 2023.10.26 |