标签 编译 下的文章

从源代码编译 Vim 实际上并不那么困难。下面是你所要做的:

1、首先,安装包括 Git 在内的所有必备的库。对于一个 Debian 类的 Linux 发行版,例如 Ubuntu,命令如下:

sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev \
    libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \
    libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \
    python3-dev ruby-dev lua5.1 lua5.1-dev libperl-dev git

在 Ubuntu 16.04 上,lua 开发包的名称是 liblua5.1-dev 而非 lua5.1-dev

如果你知道你将使用哪种语言,可随意删去你不需要的包。例如:Python2 python-dev 或者是 Ruby ruby-dev。这一原则适用于本文的大部分内容。

对于 Fedora 20,将是以下命令:

sudo yum install -y ruby ruby-devel lua lua-devel luajit \
    luajit-devel ctags git python python-devel \
    python3 python3-devel tcl-devel \
    perl perl-devel perl-ExtUtils-ParseXS \
    perl-ExtUtils-XSpp perl-ExtUtils-CBuilder \
    perl-ExtUtils-Embed

在 Fedora 20 上需要这一步来纠正安装 XSubPP 时出现的问题:

### 从 /usr/bin 到 perl 目录做个 xsubpp (perl) 的符号链接
sudo ln -s /usr/bin/xsubpp /usr/share/perl5/ExtUtils/xsubpp 

2、 如果你已经安装了 vim,删掉它。

sudo apt-get remove vim vim-runtime gvim

如果是 Ubuntu 12.04.2,你或许也需要同时删除下面这些软件包:

sudo apt-get remove vim-tiny vim-common vim-gui-common vim-nox

3、 一旦上述内容都被安装好之后,获取 vim 源代码很容易。

注意:如果你使用 python,你的配置目录或许有一个特定的机器名 (例如 config-3.5m-x86_64-linux-gnu)。检查 /usr/lib/python[2/3/3.5] 目录来找到你的 python 配置目录,据此更改 python-config-dir 和/或 python3-config-dir的参数。

添加/删除下面的编译参数以适合您的设置。例如,如果您不打算写任何 Lua 脚本,您可以删去 enable-luainterp

同时,如果你使用的不是 vim 8.0,请确认下面 VIMRUNTIMEDIR 参数设置正确(例如,如果使用 vim 8.0a, 就用 /usr/share/vim/vim80a)。记住,一些 vim 安装是直接安装在 /usr/share/vim 下的;调整好参数以适应你的系统:

cd ~
git clone https://github.com/vim/vim.git
cd vim
./configure --with-features=huge \
    --enable-multibyte \
    --enable-rubyinterp=yes \
    --enable-pythoninterp=yes \
    --with-python-config-dir=/usr/lib/python2.7/config \
    --enable-python3interp=yes \
    --with-python3-config-dir=/usr/lib/python3.5/config \
    --enable-perlinterp=yes \
    --enable-luainterp=yes \
    --enable-gui=gtk2 --enable-cscope --prefix=/usr
make VIMRUNTIMEDIR=/usr/share/vim/vim80

在 Ubuntu 16.04 上,由于同时开启了 Python2 和 Python3,Python 支持将不工作。 阅读 chirinosky 的回答 以获取变通的处理方法。

如果你想将来轻松卸载 vim,可以使用 checkinstall 来安装 。

sudo apt-get install checkinstall
cd ~/vim
sudo checkinstall

否则,可以使用 make 来安装。

cd ~/vim
sudo make install

要让 vim 成为你默认的编辑器,请使用 update-alternatives

sudo update-alternatives --install /usr/bin/editor editor /usr/bin/vim 1
sudo update-alternatives --set editor /usr/bin/vim
sudo update-alternatives --install /usr/bin/vi vi /usr/bin/vim 1
sudo update-alternatives --set vi /usr/bin/vim

4、 再检查下,通过查看 vim --version 输出来确认确实在运行新的 Vim 应用程序版本。

如果你的 gvim 不工作(在 ubuntu 12.04.1 LTS 上),试着把 --enable-gui=gtk2 参数变为 --enable-gui=gnome2

如果你遇到问题,仔细检查在步骤 3 开始提到的,使用正确的 Python 配置目录配置 configure

这些 configuremake 命令假设你是一个 Debian 发行版,Vim 的运行库文件目录放在 /usr/share/vim/vim80/,这不是 vim 的默认路径。 在 configure 命令中的 --prefix=/usr 也是如此。这些参数或许对一个不是基于 Debian 的 Linux 发行版来说是有所不同的,在这种情况下,试着移除 configure 命令中的 --prefix 变量和 make 命令中的 VIMRUNTIMEDIR (换句话说,使用这些参数的默认值)。

如果你遇到麻烦, 这里是一些其它编译 Vim 的有用的信息


via: https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source

作者:Val Markovic 等人 译者:zky001 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

gcc 编译器提供了几乎数不清的命令行选项列表。当然,没有人会使用过或者精通它所有的命令行选项,但是有一些命令行选项是每一个 gcc 用户都应该知道的 - 即使不是必须知道。它们中有一些很常用,其他一些不太常用,但不常用并不意味着它们的用处没前者大。

在这个系列的文章中,我们集中于一些不常用但是很有用的 gcc 命令行选项,在第一节已经讲到几个这样的命令行选项。

不知道你是否能够回想起,在这个系列教程的第一部分的开始,我简要的提到了开发者们通常用来生成警告的 -Wall 选项,并不包括一些特殊的警告。如果你不了解这些特殊警告,并且不知道如何生成它们,不用担心,我将在这篇文章中详细讲解关于它们所有的细节。

除此以外,这篇文章也将涉及与浮点值相关的 gcc 警告选项,以及在 gcc 命令行选项列表变得很大的时候如何更好的管理它们。

在继续之前,请记住,这个教程中的所有例子、命令和指令都已在 Ubuntu 16.04 LTS 操作系统和 gcc 5.4.0 上测试过。

生成 -Wall 选项不包括的警告

尽管 gcc 编译器的 -Wall 选项涵盖了绝大多数警告标记,依然有一些警告不能生成。为了生成它们,请使用 -Wextra 选项。

比如,下面的代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i=0;
    /* ...
       some code here 
       ...
    */

    if(i);
        return 1;
     return 0; 
}

我不小心在 if 条件后面多打了一个分号。现在,如果使用下面的 gcc 命令来进行编译,不会生成任何警告。

gcc -Wall test.c -o test

但是如果同时使用 -Wextra 选项来进行编译:

gcc -Wall -Wextra test.c -o test

会生成下面这样一个警告:

test.c: In function ‘main’:
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
 if(i);

从上面的警告清楚的看到, -Wextra 选项从内部启用了 -Wempty-body 选项,从而可以检测可疑代码并生成警告。下面是这个选项启用的全部警告标记。

  • -Wclobbered
  • -Wempty-body
  • -Wignored-qualifiers
  • -Wmissing-field-initializers
  • -Wmissing-parameter-type (仅针对 C 语言)
  • -Wold-style-declaration (仅针对 C 语言)
  • -Woverride-init
  • -Wsign-compare
  • -Wtype-limits
  • -Wuninitialized
  • -Wunused-parameter (只有和 -Wunused-Wall 选项使用时才会启用)
  • -Wunused-but-set-parameter (只有和-Wunused-Wall` 选项使用时才会生成)

如果想对上面所提到的标记有更进一步的了解,请查看 gcc 手册

此外,遇到下面这些情况, -Wextra 选项也会生成警告:

  • 一个指针和整数 0 进行 <<=>, 或 >= 比较
  • (仅 C++)一个枚举类型和一个非枚举类型同时出现在一个条件表达式中
  • (仅 C++)有歧义的虚拟基底
  • (仅 C++)寄存器类型的数组加下标
  • (仅 C++)对寄存器类型的变量进行取址
  • (仅 C++)基类没有在派生类的复制构建函数中进行初始化

浮点值的等值比较时生成警告

你可能已经知道,浮点值不能进行确切的相等比较(如果不知道,请阅读与浮点值比较相关的 FAQ)。但是如果你不小心这样做了, gcc 编译器是否会报出错误或警告?让我们来测试一下:

下面是一段使用 == 运算符进行浮点值比较的代码:

#include<stdio.h>

void compare(float x, float y)
{
    if(x == y)
    {
        printf("\n EQUAL \n");
    }
}

int main(void)
{
    compare(1.234, 1.56789);

    return 0; 
}

使用下面的 gcc 命令(包含 -Wall-Wextra 选项)来编译这段代码:

gcc -Wall -Wextra test.c -o test

遗憾的是,上面的命令没有生成任何与浮点值比较相关的警告。快速看一下 gcc 手册,在这种情形下可以使用一个专用的 -Wfloat-equal 选项。

下面是包含这个选项的命令:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

下面是这条命令产生的输出:

test.c: In function ‘compare’:
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
 if(x == y)

正如上面你所看到的输出那样, -Wfloat-equal 选项会强制 gcc 编译器生成一个与浮点值比较相关的警告。

这儿是gcc 手册关于这一选项的说明:

这背后的想法是,有时,对程序员来说,把浮点值考虑成近似无限精确的实数是方便的。如果你这样做,那么你需要通过分析代码,或者其他方式,算出这种计算方式引入的最大或可能的最大误差,然后进行比较时(以及产生输出时,不过这是一个不同的问题)允许这个误差。特别要指出,不应该检查是否相等,而应该检查两个值是否可能出现范围重叠;这是用关系运算符来做的,所以等值比较可能是搞错了。

如何更好的管理 gcc 命令行选项

如果在你使用的 gcc 命令中,命令行选项列表变得很大而且很难管理,那么你可以把它放在一个文本文件中,然后把文件名作为 gcc 命令的一个参数。之后,你必须使用 @file 命令行选项。

比如,下面这行是你的 gcc 命令:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

然后你可以把这三个和警告相关的选项放到一个文件里,文件名叫做 gcc-options

$ cat gcc-options&nbsp;
-Wall -Wextra -Wfloat-equal

这样,你的 gcc 命令会变得更加简洁并且易于管理:

gcc @gcc-options test.c -o test

下面是 gcc 手册关于 @file 的说明:

从文件中读取命令行选项。读取到的选项随之被插入到原始 @file 选项所在的位置。如果文件不存在或者无法读取,那么这个选项就会被当成文字处理,而不会被删除。

文件中的选项以空格分隔。选项中包含空白字符的话,可以用一个由单引号或双引号包围完整选项。任何字符(包括反斜杠: '\')均可能通过一个 '\' 前缀而包含在一个选项中。如果该文件本身包含额外的 @file 选项,那么它将会被递归处理。

结论

在这个系列的教程中,我们一共讲解了 5 个不常见但是很有用的 gcc 命令行选项: -Save-temps-g-Wextra-Wfloat-equal 以及 @file。记得花时间练习使用每一个选项,同时不要忘了浏览 gcc 手册上面所提供的关于它们的全部细节。

你是否知道或使用其他像这样有用的 gcc 命令行选项,并希望把它们在全世界范围内分享?请在下面的评论区留下所有的细节。


via: https://www.howtoforge.com/tutorial/uncommon-but-useful-gcc-command-line-options-2/

作者:Ansh 译者:ucasFL 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

软件工具通常情况下会提供多个功能以供选择,但是如你所知的,不是所有的功能都能被每个人用到的。公正地讲,这并不是设计上的错误,因为每个用户都会有自己的需求,他们只在他们的领域内使用该工具。然而,深入了解你所使用的工具也是很有益处的,因为你永远不知道它的某个功能会在什么时候派上用场,从而节省下你宝贵的时间。

举一个例子:编译器。一个优秀的编程语言编译器总是会提供极多的选项,但是用户一般只知道和使用其中很有限的一部分功能。更具体点来说,比如你是 C 语言开发人员,并将 Linux 作为你的开发平台,那么你很有可能会用到 gcc 编译器,这个编译器提供了 (几乎) 数不清的命令行选项列表。

你知道,你可以让 gcc 保存每个编译阶段的输出吗?你知道用于生成警告的 -Wall 选项,它并不会包含一些特殊的警告吗?gcc 的很多命令行选项都不会经常用到,但是它们在某些特定的情况下会变得非常有用,例如,当你在调试代码的时候。

所以在本文中,我们会介绍这样的几个选项,提供所有必要的细节,并通过简单易懂的例子来解释它们。

但是在开始前,请注意本文中所有的例子所使用的环境:基于 Ubuntu 16.04 LTS 操作系统,gcc 版本为 5.4.0。

在每个编译阶段查看中间代码的输出

你知道在通过 gcc 编译 c 语言代码的时候大体上共分为四个阶段吗?分别为预处理 -> 编译 -> 汇编 -> 链接。在每个阶段之后,gcc 都会产生一个将移交给下一个阶段的临时输出文件。但是生成的都是临时文件,因此我们并不能看到它们——我们所看到的只是我们发起编译命令,然后它生成的我们可以直接运行的二进制文件或可执行文件。

但是比如说在预处理阶段,如果调试时需要查看代码是如何进行处理的,你要怎么做呢?好消息是 gcc 编译器提供了相应的命令行选项,你可以在标准编译命令中使用这些选项获得原本被编译器删除的中间文件。我们所说的选项就是-save-temps

以下是 gcc 手册中对该选项的介绍:

永久存储临时的中间文件,将它们放在当前的文件夹下并根据源文件名称为其命名。因此,用 -c -save-temps 命令编译 foo.c 文件时会生成 foo.i foo.s 和 foo.o 文件。即使现在编译器大多使用的是集成的预处理器,这命令也会生成预处理输出文件 foo.i。

当与 -x 命令行选项结合使用时,-save-temps 命令会避免覆写与中间文件有着相同扩展名的输入源文件。相应的中间文件可以通过在使用 -save-temps 命令之前重命名源文件获得。

以下是怎样使用这个选项的例子:

gcc -Wall -save-temps test.c -o test-exec

下图为该命令的执行结果,验证其确实产生了中间文件:

因此,在截图中你所看到的 test.i、test.s、 test.o 文件都是由 -save-temps 选项产生的。这些文件分别对应于预处理、编译和链接阶段。

让你的代码可调试和可分析

你可以使用专有的工具调试和分析代码。如 gdb 就是专用于调试的工具,而 gprof 则是热门的分析工具。但你知道 gcc 特定的命令行选项也可以让你的代码可调试和可分析吗?

让我们开始调试之路吧!为了能在代码调试中使用 gdb,你需要在编译代码的时候使用 gcc 编译器提供的 -g 选项。这个选项让 gcc 生成 gdb 需要的调试信息从而能成功地调试程序。

如果你想要使用此选项,建议您详细阅读 gcc 手册提供的有关此选项的详细信息——在某些情况下,其中的一些内容可能是至关重要的。 例如,以下是从手册页中摘录的内容:

GCC 允许在使用 -g 选项的时候配合使用 -O 选项。优化代码采用的便捷方式有时可能会产生意想不到的结果:某些你声明的变量可能不复存在;控制流可能会突然跳转到你未曾预期的位置;一些语句也许不会执行,因为它们已经把常量结果计算了或值已经被保存;一些语句可能会在不同地方执行,因为它们已经被移出循环。

然而优化的输出也是可以调试的。这就使得让优化器可以合理地优化或许有 bug 的代码。

不只是 gdb,使用 -g 选项编译代码,还可以开启使用 Valgrind 内存检测工具,从而完全发挥出该选项的潜力。或许还有一些人不知道,mencheck 工具被程序员们用来检测代码中是否存在内存泄露。你可以在这里参见这个工具的用法。

继续往下,为了能够在代码分析中使用 gprof 工具,你需要使用 -pg 命令行选项来编译代码。这会让 gcc 生成额外的代码来写入分析信息,gprof 工具需要这些信息来进行代码分析。gcc 手册 中提到:当编译你需要数据的源文件时,你必须使用这个选项,当然链接时也需要使用它。为了能了解 gprof 分析代码时具体是如何工作的,你可以转到我们的网站专用教程进行了解。

注意-g-pg 选项的用法类似于上一节中使用 -save-temps 选项的方式。

结论

我相信除了 gcc 的专业人士,都可以在这篇文章中得到了一些启发。尝试一下这些选项,然后观察它们是如何工作的。同时,请期待本教程系列的下一部分,我们将会讨论更多有趣和有用的 gcc 命令行选项。


via: https://www.howtoforge.com/tutorial/uncommon-but-useful-gcc-command-line-options/

作者:Ansh 译者:dongdongmian 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

新进入 Linux 世界的朋友们,也许你已经下载好了 Linux 的安装 ISO,并且安装好了你的 Linux ,那么接下来,你也许希望安装一些 Linux 上用的软件。开始你可能会使用图形界面的软件中心来安装,有时候也需要使用命令行来安装,或者甚至需要自己去编译一个二进制出来——这是多么神奇的一件事啊。

那么我们今天就讲一讲如何在 Linux 上安装软件包。

本文将从 GUI 软件中心包管理器在线仓库安装本地安装源码安装 一一为你讲解有关安装软件包需要注意的事项。

本文环境

  • Ubuntu 15.04 64-bit
  • Fedora 22 64-bit

安装目标

  • wget 它是一个用于从网络上下载文件的简单自由软件,在下文我们也会用到 wget 进行下载某些文件。

相关概念

  • :我们安装程序可以从 远程仓库本地仓库 获取,这个 仓库 就是我们程序的来源,因此可以称为
  • 包管理器 :顾名思义 包管理器 是用来管理软件包的,用这个工具我们可以轻松的从仓库中安装、卸载程序。不同的发行版有不同的包管理器,Ubuntu 使用 apt-get 而 Fedora 22使用 dnf
  • 源码 : 程序的原始代码,未经过编译,通过编译源码也可以生成程序。

图形界面的软件中心

Ubuntu 软件中心

当我们处于图形界面( GUI :Graphical User Interface) 时,Ubuntu 为我们提供了一个图形界面的安装工具,称为 Ubuntu 软件中心,通过这个软件中心,我们可以像 Windows 一样通过点击几个按钮,轻松实现软件包安装。下图为打开软件中心之后的图,左边是一些分类,下面则是一些推荐的软件包。

Ubunutu 软件中心

点击已安装可以查看安装在本机的软件包,并且可以在此管理它们,如图选中 Firefox 并点击卸载,此时会提示你输入密码,输入完成且正确就会卸载你所选的程序。

已安装

接下来在搜索框搜索 wget 你可以看到如图所示的东西,并且只需点击安装并正确输入密码即可。

安装新程序

Fedora 软件中心

点开如图所示的图标就可以打开 Fedora 的软件中心。

Fedora 软件中心

打开后界面如图,分类在最下面

软件中心

点开上图的扫雷,显示如下,点击 安装 ,静候即可

安装新程序

现在转到 已安装 ,我们可以看到刚刚安装的扫雷,点击 移除 ,就可以删除了。

移除程序

如果你遇到下图,只需要输入你的密码即可。

认证

使用包管理器安装

1.换源

发行版换源方法
Ubuntu阿里云镜像配置请参考这里
USTC镜像配置请参考这里
Fedora阿里云镜像配置请参考这里
USTC镜像配置请参考这里

换源是为了提升下载速度,上文的概念已经提到了,我们安装软件是从远程仓库下载安装的,自然这个远程仓库的网络连通必须要好,并且下载速度要可观。

2.更新源

更换了源的文件后,还需要更新本地数据库信息,以便与远程仓库信息一致。

发行版包管理工具参数示例解释
Ubuntuapt-getupdatesudo apt-get update取回更新的软件包列表信息
Fedoradnfcheck-updatesudo dnf check-update取回更新的软件包列表信息

3.安装软件包

发行版包管理工具类型参数示例解释
Ubuntuapt-get远程仓库installsudo apt-get install packagename安装软件包
Fedoradnf远程仓库installsudo dnf install packagename安装软件包
Ubuntudpkg本地deb包-isudo dpkg -i filename.deb安装本地二进制deb包
Fedorarpm本地rpm包-isudo rpm -i filename.rpm安装本地二进制rpm包

4.卸载软件包

发行版包管理工具参数示例解释
Ubuntuapt-getremovesudo apt-get remove packagename卸载软件包
Fedoradnfremovesudo dnf remove packagename卸载软件包
Ubuntudpkg-rsudo dpkg -r packagename卸载软件包

5.升级所有软件包

发行版包管理工具参数示例解释
Ubuntuapt-getupgradesudo apt-get upgrade升级所有软件包
Fedoradnfupgradesudo dnf upgrade升级所有软件包

6.其它参数

发行版包管理工具参数示例解释
Ubuntuapt-getpurgesudo apt-get purge packagename卸载并清除软件包的配置
sourceapt-get source packagename下载源码包文件
cleansudo apt-get clean删除所有已下载的包文件
downloadapt-get download packagename下载指定的二进制包到当前目录
--helpapt-get --help获取帮助
Fedoradnfcleansudo dnf clean清除旧缓存
makecachesudo dnf makecache生成新缓存
-hdnf -h获取帮助

从源码编译安装

有些时候我们会发现有的软件包并没有包含在软件仓库中,也没有可用的二进制包,这时候我们可以尝试从源码编译安装,我在此处仍以wget 为例,示范如何编译,并解决编译遇到的问题

以下环境为 Ubuntu 15.04

$ mkdir buildwget #构建目录
$ cd buildwget
$ wget http://ftp.gnu.org/gnu/wget/wget-1.16.tar.xz         #下载源码包
$ sudo apt-get remove wget  #为了后面的测试,先把 wget 卸载了
$ xz -d wget-1.16.tar.xz  #解压 xz 文件
$ tar -xvf wget-1.16.tar #解档 tar 文件
$ cd wget-1.16
$ ls                     #列出文件
ABOUT-NLS   ChangeLog.README  GNUmakefile   maint.mk     po       util
aclocal.m4  configure         INSTALL       Makefile.am  README
AUTHORS     configure.ac      lib           Makefile.in  src
build-aux   COPYING           m4            msdos        testenv
ChangeLog   doc               MAILING-LIST  NEWS         tests

上面的文件就是我们将要编译的源文件,其中有个特别要注意的就是 INSTALL,我们要养成一个习惯,多看 INSTALL 文件,这个文件会告诉我们怎么编译,编译时需要注意什么?但由于此处的编译较简单,所以 INSTALL 也没有提到什么特别重要的事情。

按照 INSTALL 我们先执行 ./configure

$ ./configure

如果出现如下的错误

configure: error: --with-ssl=gnutls was given, but GNUTLS is not available.

错误提示说,给定的 SSLgnutls 但是却不可用(因为没有安装),因此我们安装并指定 opensslwgetSSL

$ sudo apt-get install openssl 
$ sudo apt-get install libssl-dev
$ ./configure --with-ssl=openssl

如果没有问题,执行完后应该显示如下

configure: Summary of build options:

  Version:           1.16
  Host OS:           linux-gnu
  Install prefix:    /usr/local
  Compiler:          gcc
  CFlags:            -g -O2 
  LDFlags:           
  Libs:              -lssl -lcrypto -ldl -lz 
  SSL:               openssl
  Zlib:              yes
  PSL:               no
  Digest:            yes
  NTLM:              yes
  OPIE:              yes
  Debugging:         yes

然后进行编译

$ make

会输出很多编译信息,不要担心,如果最后没有报错而停止,则编译成功,接下来进行安装

$ sudo make install

试试是不是 wget 命令又出来了?源码安装遇到问题,我们要善于搜索,提问和解决,根据报错内容进行相应的编译调整,缺少的依赖装上,一般就可以成功。

总结

本文主要为新手讲解了 UbuntuFedora 安装软件包的一些方法, 相较之前的版本,本次更改由繁化简,并且以表格的形式给出参数和命令,要熟练和体会这些命令到底是干嘛的,还必须亲自敲一敲,去理解这个命令的作用。从源码编译安装,则展示了一个遇到问题,解决问题的过程,由于编译 wget 较简单,此处也未遇到特别难处理的问题,但这清晰的展示了一个编译安装的过程,遇到错误,我们不要害怕,而要认真阅读给出的错误信息,借此搜索,提问,寻求解答。另外 Linux 下遇到问题首先要自己善于去搜索,提问,解决问题得到答案并归纳总结,不然是很难学到知识的。

提问: 我想在Linux中从源码编译视频编码程序。到那时,在编译时,我遇到了一个错误“fatal error: x264.h: No such file or directory”,我该如何修复?

下面的编译错误错明你系统中没有x264开发库文件。

fatal error: x264.h: No such file or directory

x264是GNU GPL授权的H.264/MPEG-4 AVC编码库。x264库被广泛用于视频编码/转码程序比如Avidemux、FFmpegHandBrake、 OpenShot、 MEncode等等。

要解决这个问题,你需要安装x264的开发库文件。你可以如下做。

在 Debian、 Ubuntu 或者 Linux Mint 中安装像x264库和开发文件

在基于Debian的系统中,x264库已经包含在基础仓库中。可以直接用apt-get来安装。

 $ sudo apt-get install libx264-dev

在 Fedora、 CentOS/RHEL中安装像x264库和开发文件

在基于Red Hat的发行版比如Fedora或者CentOS,x264库在免费的RPM Fusion仓库中有。那么,你需要首先安装RPM Fusion (免费)

RPM Fusion设置完成后,你可以使用下面的命令安装x264开发文件。

 $ sudo yum --enablerepo=rpmfusion-free install x264-devel 

注意RPM Fusion仓库在CentOS 7中还没有,因此上面的方法在CentOS 7中还不可行。万一是CentOS 7 ,你可以从源码编译并安装x264,下面会解释的。

在Debian、 Ubuntu 或者 Linux Mint中源码编译x264库

如果libx264包在你的发行版中并没有,那么你可以按照下面的方法编译最新的x264库。

$ sudo apt-get install g++ automake autoconf libtool yasm nasm git
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure --enable-static --enable-shared
$ make
$ sudo make install 

x264库将会安装在/usr/local/lib。要让其他程序可以使用这个库,你需要完成最后一步。

打开/etc/ld.so.conf,并添加下面的行。

$ sudo vi /etc/ld.so.conf 

/usr/local/lib

最后运行下面的命令重新加载共享库:

$ sudo ldconfig

在 Fedora, CentOS/RHEL 中源码编译x264库

如果你Linux的发行版中没有x264库(比如:CentOS 7)或者x264库并不是最新的,你可以如下编译最新的x264库。

$ sudo yum install gcc gcc-c++ automake autoconf libtool yasm nasm git
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure --enable-static --enable-shared
$ make
$ sudo make install 

最后,要让其他的程序可以访问到位于 /usr/local/lib的x264库,在 /etc/ld.so.conf加入下面的行。

$ sudo vi /etc/ld.so.conf 

/usr/local/lib

最后运行下面的命令重新加载共享库:

$ sudo ldconfig 


via: http://ask.xmodulo.com/fatal-error-x264-h-no-such-file-or-directory.html

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

提问:我在安装一个设备驱动前先要安装内核头文件。怎样安装合适的内核头文件?

当你在编译一个设备驱动模块时,你需要在系统中安装内核头文件。内核头文件同样在你编译与内核直接链接的用户空间程序时需要。当你在这些情况下安装内核头文件时,你必须确保内核头文件精确地与你当前内核版本匹配(比如:3.13.0-24-generic)。

如果你的内核是发行版自带的内核版本,或者使用默认的包管理器的基础仓库升级的(比如:apt-ger、aptitude或者yum),你也可以使用包管理器来安装内核头文件。另一方面,如果下载的是kernel源码并且手动编译的,你可以使用make命令来安装匹配的内核头文件。

现在我们假设你的内核是发行版自带的,让我们看下该如何安装匹配的头文件。

在 Debian、Ubuntu 或者 Linux Mint 上安装内核头文件

假设你没有手动编译内核,你可以使用apt-get命令来安装匹配的内核头文件。

首先,使用dpkg-query命令检查是否有可用的内核头文件。

$ dpkg-query -s linux-headers-$(uname -r) 

dpkg-query: package 'linux-headers-3.11.0-26-generic' is not installed and no information is available

接着使用下面的命令安装匹配的内核头文件。

$ sudo apt-get install linux-headers-$(uname -r) 

验证头文件是否成功安装。

$ dpkg-query -s linux-headers-$(uname -r) 

Package: linux-headers-3.11.0-26-generic
Status: install ok installed

Debian、Ubuntu、Linux Mint默认头文件在/usr/src下。

在 Fedora、CentOS 或者 RHEL 上安装内核头文件

假设你没有手动编译内核,你可以使用yum命令来安装匹配的内核头文件。

首先,用下面的命令检查系统是否已经安装了头文件。如果下面的命令没有任何输出,这就意味着还没有头文件。

$ rpm -qa | grep kernel-headers-$(uname -r)

接着用yum命令安装头文件。这个命令会自动找出合适的头文件并安装。

$ sudo yum install kernel-headers 

验证包安装的状态。

$ rpm -qa | grep kernel-headers-$(uname -r) 

kernel-headers-3.10.0-123.9.3.el7.x86_64

Fedora、CentOS 或者 RHEL上默认内核头文件的位置是/usr/include/linux


via: http://ask.xmodulo.com/install-kernel-headers-linux.html

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出