我只想分享我如何找到错误的解决方案



运行X / Motif C应用程序时。我之所以发布此信息,是因为我在网上搜索时仅发现了对此问题的一个引用,并且其中没有解决方案。

我设法解决了这个问题,并希望与您分享我的发现,如果您再次遇到此问题(注意:我并不是说我的解决方案将始终解决此类错误)。

问题

我在运行使用Motif和X Intrinsics工具包的简单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");
}

最佳答案

我怀疑问题可能出在libXt上,因为该库中定义了XtRealizeWidget符号。我使用nm进行了查看,但一切似乎都很好:

$ nm -D /usr/lib/libXt.so |grep XtRealizeWidget
02b39870 T XtRealizeWidget

“T”表示该符号位于组成libXt库的目标文件的文本(代码)部分中,因此已定义此符号。系统库的路径也正确,我只有一个版本的libXt。

然后我以为库被传递到gcc链接器的顺序可能是原因,并开始阅读它,最终出现在此stackoverflow thread上。

将库的顺序切换为:
$ gcc -Wall -o push push.o -lXm -lXt

问题解决了。

注意将库和传递给链接器的顺序!

09-05 21:53