首页 > 解决方案 > gcc 对话框库未链接

问题描述

我正在尝试使用 C 中的对话框库(linux 中的对话框命令)开发一个小型实用程序。

在 fedora linux 上工作正常,但如果我尝试在 debian 上使用以下命令编译它:

gcc -ldialog -lncurses -I/usr/include dialog_test.c

我收到以下错误:

vetinari@ankhmorpork:~/Projects/Other/test$ gcc -ldialog -I/usr/include dialog_test.c 
/usr/bin/ld: /tmp/ccX6fPYB.o: warning: relocation against `dialog_vars' in read-only section `.text'
/usr/bin/ld: /tmp/ccX6fPYB.o: in function `main':
dialog_test.c:(.text+0x5c): undefined reference to `init_dialog'
/usr/bin/ld: dialog_test.c:(.text+0x79): undefined reference to `dialog_yesno'
/usr/bin/ld: dialog_test.c:(.text+0xae): undefined reference to `dialog_menu'
/usr/bin/ld: dialog_test.c:(.text+0xbc): undefined reference to `dialog_vars'
/usr/bin/ld: dialog_test.c:(.text+0xc5): undefined reference to `end_dialog'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status

对话框命令工作正常。

任何人都知道为什么它不能在 debian 上运行?

标签: dialogld

解决方案


(为了wiki的缘故回答,以防以后有人来这里)

您必须将要链接的库放在 gcc 命令的末尾,如下所示:

gcc dialog_test.c -ldialog -lncurses

原因在这里解释:链接器查找符号的方式必须首先查看引用,然后是提供符号的库

此外,对话框库可能具有除ncurses. 这里有解释如何找出要包含的内容和链接内容,简而言之:dialog-config应该告诉你。在这种特定情况下,对我有用的(ubuntu 20.04)是链接ncursesw而不是ncurses.

在那之后,我留下了一个

undefined reference to `sqrt'

链接器错误,可以通过使用-lm.

所以,总的来说,这个命令有效:

gcc dialog_test.c -ldialog -lncursesw -lm

推荐阅读