如何向configure/make循环添加include和lib路径?

109
我需要在一个我没有su权限的linux盒子上安装库的地方。我正在使用~/local[/bin,/lib,/include],但我不知道如何告诉./configure在那里查找库(特别是我正在尝试编译需要libgif的emacs,这在我的发行版中不存在)。
我尝试添加:
export PATH=$PATH:~/local/bin
export LD_LIBRARY_PATH=~/local/lib
export C_INCLUDE_PATH=~/local/include
export CPLUS_INCLUDE_PATH=~/local/include

我将内容添加到了.bashrc文件中,但它似乎不起作用。


4
请注意,除了 PATH 之外,你会覆盖系统默认的环境变量。如果你像这样设置 export C_INCLUDE_PATH=~/local/include:$C_INCLUDE_PATH,那么编译器将首先在 ~/local/include 中搜索所需的文件,在第一个目录中未找到时才会去 $C_INCLUDE_PATH 查找。 - Marc Plano-Lesay
6个回答

110

你需要一个config.site文件。请尝试:

$ mkdir -p ~/local/share
$ cat << EOF > ~/local/share/config.site
CPPFLAGS=-I$HOME/local/include
LDFLAGS=-L$HOME/local/lib
...
EOF

每当使用--prefix=$HOME/local调用autoconf生成的configure脚本时,都会读取config.site,并为您进行所有分配。 CPPFLAGS和LDFLAGS应该是您所需要的全部内容,但您也可以进行其他任何所需的分配(因此在上面的示例中有...)。 注意,-I标志属于CPPFLAGS而不是CFLAGS,因为-I旨在用于预处理器而不是编译器。


William;非常感谢你提供的有关在共享主机上构建CPPFLAGS的建议。因为你的留言,今天我省去了很多失败的./configure运行所带来的麻烦。 - Brian Tiffin

43

当您运行make时,请设置LDFLAGS和CFLAGS:

$ LDFLAGS="-L/home/me/local/lib" CFLAGS="-I/home/me/local/include" make

如果你不想重复这个过程很多次,可以在你的.bashrc文件中(或者相应的shell文件)添加以下内容进行导出。同时设置LD_LIBRARY_PATH包含/home/me/local/lib:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/local/lib

1
当我将LDFLAGS和CFLAGS添加到.bashrc中时,./configure会失败并显示错误消息:configure: error: C compiler cannot create executables... - Lacrymology
他们可能正在覆盖配置测试代码编译器参数。只需使用make env prefetching即可。 另外,请尝试查看一下configure是否已经有覆盖libgif的选项。如果autotools脚本制作得当,它将允许您指定libgif安装路径(例如,覆盖默认库位置)。那将是更清洁的解决方案。 - long404
同样的区别.. tneme@ws16lab07:~/Descargas/emacs-23.3$ LDFLAGS="-L/home/tneme/local/lib" CFLAGS="-l/home/tneme/local/include" ./configure --prefix="/home/tneme/local" 检查构建系统类型... i686-pc-linux-gnu 检查主机系统类型... i686-pc-linux-gnu 检查gcc... gcc 检查C编译器是否工作... 否 配置错误:在`/home/tneme/Descargas/emacs-23.3'中: 配置错误:C编译器无法创建可执行文件 有关更多详细信息,请参见“config.log” - Lacrymology
这些应该在“make”时定义,而不是在“configure”时定义。 - long404
刚刚尝试使用以下配置来配置emacs 23,我没有遇到那个问题: LDFLAGS="-L/home/me/local/lib" CFLAGS="-I/home/me/local/include" ./configure 检查构建系统类型... x86_64-unknown-linux-gnu 检查主机系统类型... x86_64-unknown-linux-gnu 检查gcc是否存在... gcc 检查C编译器默认输出文件名... a.out 检查C编译器是否工作... 是 检查是否进行交叉编译... 否 检查可执行文件后缀... 检查目标文件后缀... o 检查是否使用GNU C编译器... 是 - long404
显示剩余2条评论

9

这个问题花了我很长时间才解决。当我在Ubuntu上为ARM目标交叉编译时,遇到了这个问题。我通过以下方式解决:

PATH=$PATH:/ccpath/bin CC=ccname-gcc AR=ccname-ar LD=ccname-ld CPPFLAGS="-nostdinc -I/ccrootfs/usr/include ..." LDFLAGS=-L/ccrootfs/usr/lib ./autogen.sh --build=`config.guess` --host=armv5tejl-unknown-linux-gnueabihf

注意:使用CFLAGS在autogen.sh/configure中不起作用,使用它会导致错误:“configure: error: C compiler cannot create executables”。在我使用的构建环境中提供了一个autogen.sh脚本,如果你没有autogen.sh脚本,请在上面的命令中用./configure代替./autogen.sh。我在目标系统上运行了config.guess以获取--host参数。
成功运行autogen.sh/configure后,使用以下命令进行编译:
PATH=$PATH:/ccpath/bin CC=ccname-gcc AR=ccname-ar LD=ccname-ld CPPFLAGS="-nostdinc -I/ccrootfs/usr/include ..." LDFLAGS=-L/ccrootfs/usr/lib CFLAGS="-march=... -mcpu=... etc." make

我选择使用的CFLAGS是:“-march=armv5te -fno-tree-vectorize -mthumb-interwork -mcpu=arm926ej-s”。正确设置所有包含目录可能需要一些时间:您可能希望一些包含指向交叉编译器,一些指向根文件系统包含,并且可能会出现一些冲突。
我确定这不是完美的答案。在Makefile中仍然可以看到一些包含目录指向/而不是/ccrootfs。希望这可以帮助某些人。

1

除了其他答案之外,有时您还需要设置PKG_CONFIG_PATH

export PKG_CONFIG_PATH=~/local/lib/pkgconfig

0
例如,使用 $HOME/curl 构建 git

package=git
version=2.17.0

tarUrl=https://mirrors.edge.kernel.org/pub/software/scm/git/$package-$version.tar.gz
install(){
   ./configure --prefix=$HOME
   LDFLAGS="-L$HOME/lib" CFLAGS="-I$HOME/include" make -j 2
   make install
}
if [ -e $package-$version.tar.gz ]; then
   echo "cache"
else
   wget --no-check-certificate ${tarUrl}
   tar -xvf $package-$version.tar.gz
fi
cd ./$package-$version
install

0

要仅为当前命令更改环境,请参考Carl Norum的建议
   LDFLAGS+="-L<directory>" CFLAGS+="-I<directory>" make("make"命令应在末尾)

例如:
     LDFLAGS+="-L/usr/lib" CFLAGS+="-I/usr/include/gstreamer-1.0 -I/usr/include/opencv4 -I/opt/nvidia/deepstream/deepstream-6.1/sources/includes" make


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接