programing

Realize 클래스 프로시저가 정의되지 않았습니다.

newstyles 2023. 10. 26. 20:48

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