与GCC(CentOS)中的包含/库搜索路径不一致

时间:2014-12-22 21:31:17

标签: c gcc centos gnu ld

基本上我有两个版本的GMP库:

  • 供应商提供的一个,即使用标准存储库中的包管理器,即两个包:gmpgmp-devel
  • 第二个是我自己编写的(它是最新版本,经过各种调整编译等)。

前者位于“通常位置”(如POSIX),此处为:/usr/include/usr/lib64/。第二个路径为/usr/local/include/usr/local/lib。考虑到后者尚未安装(即仅由make编译)。

这是一些“虚拟”程序:

#include <stdio.h>
#include <gmp.h>

int main(void)
{
    mpz_t a, b, c;

    printf("%d.%d.%d\n", __GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL);

#if __GNU_MP_VERSION >= 6
    mpz_inits(a, b, c, NULL);
    mpz_clears(a, b, c, NULL);
#endif

    return 0;
}

对于库存版本显然它编译没有任何问题:

$ gcc -std=gnu99 -Wall dummy.c -lgmp

但是,如果我安装第二版GMP(即/usr/local目录中的make install目录),那么:

GNU预处理器cpp首先找到/usr/local/include路径(请参阅cpp手册中的2.3 Search Path)。换句话说,我不需要添加-I/usr/local/include。此外,“强制”使用“通常位置”标题并不容易,因为-I/usr/include选项被忽略(一种解决方案是添加-nostdinc选项并定义明确的标题列表,没有/usr/local/include路径)。

GNU链接器ld 表现完全相反,它在编译期间不会搜索/usr/local/lib(或更精确地说是链接),因此我得到:

$ gcc -std=gnu99 -Wall dummy.c -lgmp
/tmp/ccCCfPMX.o: In function `main':
dummy.c:(.text+0x41): undefined reference to `__gmpz_inits'
dummy.c:(.text+0x5d): undefined reference to `__gmpz_clears'
collect2: ld returned 1 exit status

我理解,我必须添加-L/usr/local/lib,所以现在ld正在使用正确的路径。要运行此程序(因为它是使用GMP编译为共享库),我需要:

  1. 暂时设置LD_LIBRARY_PATH(或者将其放入.bashrc.zshrc等。)
  2. 使用-Wl,-rpath=/usr/local/lib
  3. 的“固定”运行时路径(rpath)进行编译
  4. 添加(缺少?)条目到/etc/ld.so.conf.d/,运行# ldconfig以更新其索引。
  5. 我的问题是,这就是为什么预处理器和链接器/加载器之间存在这种不一致的原因?我错过了一些明显的东西吗?

0 个答案:

没有答案