我正在开发一个应用程序,我需要在其中使用PolicyKit,并且PolicyKit似乎使用Glib库。发生的情况是我安装了 PolicyKit,但标头的位置位于/usr/include/polkit-1/
和/usr/include/glib-2.0
。
标头的内部位置有
/usr/include/
,
/usr/include/polkit
,
/usr/include/gobject
。
我无法编译,因为编译器在标头所说的位置找不到标头。我尝试单独修改每个标头,但是花费的时间太长,而且我不知道什么时候才能完成。
这里的问题是,当它们被安装时,它们被安装在/usr/include/polkit-1
并且/usr/include/glib-2.0
当它们应该被/usr/include
单独安装时。换句话说,该文件夹polkit-1
不glib-2.0
应该在那里。有人知道如何通过将文件和文件夹放在各自的位置来快速解决此问题吗?
答案1
我不知道详细信息,但某些软件包和库会以这种方式安装它们的文件,并且还会使用它们的路径安装文件,以便您可以用来pkg-config
查找正确的路径。
我没有polkit
,但是在这里,对于glib-2.0
,我可以要求pkg-config
给我要使用的“cflags”并与库一起编译glib-2.0
(“cflags”是与 C 编译器一起使用的标志,用于指定包含路径和要在以下情况下添加的库)链接):
$ pkg-config --cflags --libs glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -lglib-2.0
我猜,对于polkit-1
,你会这样做 $ pkg-config --cflags --libs glib-2.0 polkit-1
要使用这些参数进行编译,请将它们存储在 makefile 的变量中,复制它们的结果,或者甚至可以pkg-config
直接在 shell 中调用 - 如联机帮助页中的以下示例所示:
cc program.c $(pkg-config --cflags --libs gnomeui)
(实际上,该示例是一个Makefile
规则,但您也可以在 shell 中执行此操作。)
有关一些详细信息,请参阅联机帮助页,并检查 和 下可用的文件及其.pc
对应 /usr/lib/pkgconfig
文件。/usr/share/pkgconfig
/usr/local
AFAIK,这是使用外部库进行编译的可移植方式。
答案2
我同意 Giles 的评论,并认为 njsg 的 pkg_command 很棒。
LD_LIBRARY_PATH
启用链接编辑器 ld 定位库文件的另一个常见策略是将其目录从 ld 手册页添加到环境变量中
从曼LD
The linker uses the following search paths to locate required shared libraries: 1. Any directories specified by -rpath-link options. 2. Any directories specified by -rpath options. The difference between -rpath and -rpath-link is that directories specified by -rpath options are included in the executable and used at runtime, whereas the -rpath-link option is only effective at link time. Searching -rpath in this way is only supported by native linkers and cross linkers which have been configured with the --with-sysroot option. 3. On an ELF system, for native linkers, if the -rpath and -rpath-link options were not used, search the contents of the environment variable "LD_RUN_PATH". 4. On SunOS, if the -rpath option was not used, search any directories specified using -L options. 5. For a native linker, the search the contents of the environment variable "LD_LIBRARY_PATH".
请阅读手册页以获取更多选项。
不要重新排列包裹。
答案3
谢谢。我通过这样做修复了它:
sudo cp -r /usr/include/polkit-1/polkit /usr/include/polkit
sudo cp -r /usr/include/polkit-1/polkitagent /usr/include/polkitagent
sudo cp -r /usr/include/polkit-1/polkitbackend /usr/include/polkitbackend
sudo cp -r /usr/include/glib-2.0/gio /usr/include/gio
sudo cp -r /usr/include/glib-2.0/glib /usr/include/glib
sudo cp -r /usr/include/glib-2.0/gobject /usr/include/gobject
sudo cp -r /usr/include/glib-2.0/glib-object.h /usr/include/glib-object.h
sudo cp -r /usr/include/glib-2.0/glib-unix.h /usr/include/glib-unix.h
sudo cp -r /usr/include/glib-2.0/glib.h /usr/include/glib.h
sudo cp -r /usr/include/glib-2.0/gmodule.h /usr/include/gmodule.h
如果有人遇到同样的问题并使用它,则不得删除该glib-2.0
文件夹,因为它仍然会被使用。
不管怎样,现在我失踪了glibconfig.h
,而且它在系统中也不存在。我不知道要安装什么才能获得它。