gcc 对话框库未链接

gcc dialog library not linking

我正在尝试使用 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 上运行吗?

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

你必须把你想要的库 link 放在 gcc 命令的末尾,像这样:

gcc dialog_test.c -ldialog -lncurses

原因解释here:linker 查找符号的方式必须首先查看引用,然后是提供符号的库

此外,对话框库可能具有 ncurses 以外的其他依赖项。有说明如何找出要包含的内容以及要包含的内容 link ,简而言之:dialog-config 应该会告诉您相关信息。 在这种特定情况下,对我有用的 (ubuntu 20.04) 是 linking ncursesw 而不是 ncurses.

在那之后,我得到了

undefined reference to `sqrt'

link错误,可以通过link使用-lm匹配库解决。

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

gcc dialog_test.c -ldialog -lncursesw -lm