我已经编译了第一个 X11 程序,但无法链接它。 我使用的是 64 位 Xubuntu 13.10,并且使用命令行 gcc $(pkg-config x11) findXfonts.c -o findXfonts
它可以编译,但是我使用的每个 X* 符号在链接器步骤中都显示为未定义。 pkg-config 习惯用法扩展为简单的 -lX11
/*
* Copyright 2014 Kevin O'Gorman <[email protected]>.
* Distributed under the GNU General Public License.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
char **fontlist;
XFontStruct *returned_info;
char *pattern="-*-*-*-*-*-*-*-*-*-*-*-*-*-*-";
int nFonts;
char *displayName;
Display *display;
FILE *ostream = stdout;
int i, j, k;
displayName = getenv("DISPLAY"); /* expect ":0.0", but YMMV */
display = XOpenDisplay(displayName);
fontlist = XListFontsWithInfo(display, pattern, 10000, &nFonts, &returned_info);
for (i = 0; i < nFonts; i++) {
fprintf(ostream, "\n%s\n", fontlist[i]);
fprintf(ostream, " first: %u/%u, last: %u/%u\n",
returned_info[i].min_byte1, returned_info[i].min_char_or_byte2,
returned_info[i].max_byte1, returned_info[i].max_char_or_byte2);
for (j = 0; j < returned_info[i].n_properties; j++) {
fprintf(ostream, " %s: %ld\n",
XGetAtomName(display, returned_info[i].properties[j].name),
returned_info[i].properties[j].card32);
}
}
XFreeFontInfo(fontlist, returned_info, nFonts);
return EXIT_SUCCESS;
}
这是错误的
pkg-config 习语扩展为简单的 -lX11
事实上如果你尝试
echo $(pkg-config x11)
你什么也得不到。相反
echo $(pkg-config x11 --cflags --libs)
输出(在我的系统上)
-lX11
这就是您想要的,并且您需要在系统上正确设置所有内容才能编译和开发 X11 代码。
因此,您在
--cflags --libs
中添加 $(...)
就足够了。
尝试:
gcc $(pkg-config x11 --cflags) findXfonts.c -o findXfonts $(pkg-config x11 --libs)
欲了解更多信息,
pkg-config
有手册页:
man pkgconf
存在三个问题。
首先,我放弃了 --libs 切换到 pkg-config。 (在这种情况下 --cflags 开关没有任何作用)。 我也把它放在了命令行中的错误位置。
其次,链接器找不到X11库。 我必须告诉它要查找哪个目录。有些人为此使用 LD_LIBRARY_PATH,但由于我同时拥有 64 位和 32 位库,因此我不需要单一方法。
最后,我制作了一个Makefile,最终得到
gcc -Wall -ansi -g -m64 -c findXfonts.c
gcc findXfonts.o -m64 -L/usr/lib/x86_64-linux-gnu -lX11 -o findXfonts
最后,一旦编译并链接,我发现“pattern”字符串末尾有一个额外的连字符(“-”)。 我删除了它,得到了 1400 多种字体的列表。