如何链接X11程序

问题描述 投票:0回答:3

我已经编译了第一个 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;
}
c linker x11
3个回答
2
投票

这是错误的

pkg-config 习语扩展为简单的 -lX11

事实上如果你尝试

echo $(pkg-config x11)

你什么也得不到。相反

echo $(pkg-config x11  --cflags --libs)

输出(在我的系统上)

-lX11

这就是您想要的,并且您需要在系统上正确设置所有内容才能编译和开发 X11 代码。

因此,您在

--cflags --libs
中添加
$(...)
就足够了。


2
投票

尝试:

gcc $(pkg-config x11 --cflags) findXfonts.c -o findXfonts $(pkg-config x11 --libs)

欲了解更多信息,

pkg-config
有手册页:

man pkgconf

0
投票

存在三个问题。

首先,我放弃了 --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 多种字体的列表。

© www.soinside.com 2019 - 2024. All rights reserved.