pkg-config 出了点问题

gid*_*eon 5 fedora pkg-config

我最近经历了一段痛苦的时光,只是试图编译几个 C 程序,因为我找不到库所在的位置,而且 pkg-config 似乎有问题。

我像这样安装了 GNU GSL:

wget ftp://ftp.gnu.org/gnu/gsl/gsl-1.15.tar.gz
tar xvzf gsl-*gz
cd gsl-1.15
./configure
make
sudo make install
Run Code Online (Sandbox Code Playgroud)

显然它安装在/usr/local/lib哪个非标准的地方?(1)什么是标准场所?(2)我如何让它安装在那里?

而且我无法编译一个使用这个库的简单程序:

$ gcc gsl_erf.c -o gsl -I/usr/local/lib -L/usr/local/lib
/tmp/cc3WD9Zq.o: In function `main':
gsl_erf.c:(.text+0x24): undefined reference to `gsl_cdf_gaussian_P'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

现在,使用 pkg-config :

pkg-config --libs --cflags gslPackage gsl was not found in the pkg-config search path.
Perhaps you should add the directory containing `gsl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gsl' found
Run Code Online (Sandbox Code Playgroud)

所以我确实添加了目录:

PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
Run Code Online (Sandbox Code Playgroud)

但还没有运气!:( pkg-config 仍然给我和上面一样的消息。( Perhaps you sh ...)

这是我在编译一些 C 程序时经常遇到的一个更普遍的问题。我希望有一个通用的解决方案:

  1. 我在哪里以及如何安装我的 C 库?(也许是 yum 安装它们的同一个地方?)
  2. 如何更正/配置和使用 pkg-config

更新:我尝试了下面的答案之一,运行编译的程序给了我这个:./gsl_app: error while loading shared libraries: libgsl.so.0: cannot open shared object

gol*_*cks 9

显然它安装在 /usr/local/lib 这是一个非标准的地方?

这是一个标准位置,但有时系统配置假设您不打算构建安装任何东西,因此它被排除在链接器缓存路径之外。

我在哪里以及如何安装我的 C 库?(也许是 yum 安装它们的同一个地方?)

这通常是一个坏主意,尤其是。如果有潜在的发行版软件包——现在,或者即将上线——那么就会发生冲突。坚持使用 /usr/local。

/usr/local/lib通过运行检查是否在 ld.so.cache 中ldconfig -v 2>&1 | grep /usr/local。如果您没有得到任何输出,请创建一个/etc/ld.so.conf.d/local.conf包含一行的文件:

/usr/local/lib
Run Code Online (Sandbox Code Playgroud)

ldconfig再次运行该行,这次您应该会看到它。 每次从源构建和安装库时,您都需要运行ldconfig。

我无法编译一个使用这个库的简单程序

因为你必须将pkg-config参数传递给编译器。首先,您需要找到实际的gsl.pc.

find /usr/local -name gsl.pc
Run Code Online (Sandbox Code Playgroud)

我认为它更有可能在/usr/local/lib/pkgconfig,而不是/usr/local/pkgconfig像你说的那样。试试看pkg-config --list-all | grep gsl有没有找到。如果不是export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH(或 gsl.pc 所在的任何目录),请重试。当你做对了,你可能想把它添加到某个地方,例如,/etc/profile.d.

现在,要实际编译:

gcc gsl_erf.c -o gsl `pkg-config --libs --cflags gsl`
Run Code Online (Sandbox Code Playgroud)

你不需要包括-I和-L你自己;这就是为什么pkg-config,尽管您之前可能缺少的只是-lgsl.