2018-06-12 11:52:23 Dong_Alex 阅读数 3114
  • 安卓编译与开发、Linux内核及驱动

    安卓编译与开发、Linux内核及驱动视频教程,该课程内容包括一、源码编译:1、常见的ROM种类、谷歌的ROM、第三方的ROM2、区别3、RockChip的ROM、4、编译环境配置、源码下载、编译命令;二、源码开发:源码结构分析、Launcher开发、需求分析、系统级应用;三、内核讲解:内核用途、内核结构、内核职能、内核源码编译、驱动开发;四、内核开发:1、体系架构、目录结构、中断机制、内核进程控制、2、内核库文件、例子简单分析、3、内核调度流程4、内核组件工具 嘉宾介绍:仝利,英文名Burning,CSDN博客讲师,多年主要从事于流媒体,网络通讯,p2p等技术的开发与研究。目前在创业,产品是面向企业会议室和家庭客厅的多媒体通讯盒子的开发。国内还没有相关产品,预计产品会在8月份上市。

    9278 人正在学习 去看看 CSDN讲师

linux 系统下源码编译安装搭建自定义lamp环境(linux+apache+mysql+php)

目地:在linux系统上源码编译安装搭建lamp环境并配置 , 守护进程, 软连接集中管理配置文件, phpmyadmin数据库在线管理

实验操作环境: linux centos7.4 64位 腾讯云服务器

友情连接:  LNMP搭建: https://blog.csdn.net/Dong_Alex/article/details/80712018

apache(httpd)使用2.4 官网源码

php使用5.6 官网源码

mysql使用5.7 官网源码


开始

# 一.安装apache (httpd)
# 安装依赖:gcc, apr, apr-util,apr-iconv, pcre
# 安装gcc
yum install gcc
# apr, apr-util, apr-iconv , pcre yum没有, 需要下载源码安装
# 获取apr
wget http://mirror.bit.edu.cn/apache//apr/apr-1.6.3.tar.gz
# 获取apr-util
wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
# 获取apr-iconv
wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-iconv-1.2.2.tar.gz
# 获取pcre
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
# 获取httpd (apache)
wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.29.tar.gz 
# 获取php5.6
wget -c -O  php5.6.36.tar.gz  http://cn2.php.net/get/php-5.6.36.tar.gz/from/this/mirror
# 获取boost mysql5.7及以上版本需要,5.6不需要
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
# 获取mysql5.7
wget -c https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22.tar.gz

# 1.安装apr
# 解压apr
tar zxvf apr-1.6.3.tar.gz

# 安装依赖libtool 
yum install libtool

# 进入配置
cd apr-1.6.3/
./buildconf

# 配置
./configure --prefix=/usr/local/apr-1.6.3

# 编译安装
make && make install

# 2.安装apr-iconv 
# 解压
cd apr-iconv-1.2.2/
tar zxvf apr-iconv-1.2.2.tar.gz 

# 配置
./configure --prefix=/usr/local/apr-iconv-1.2.2 --with-apr=/usr/local/apr-1.6.3/bin

# 编译安装
make && make install

# 3.安装apr-util
# 解压 apr-util
tar zxvf apr-util-1.6.1.tar.gz

#  解决报类似#include <expat.h>错误,需yum安装expat: yum install expat-devel 
yum install expat-devel

# 配置
cd apr-util-1.6.1/
# --with-apr=apr 安装bin目录
./configure --prefix=/usr/local/apr-util-1.6.1 --with-apr=/usr/local/apr-1.6.3/bin  --with-apr-iconv=/usr/local/apr-iconv-1.2.2/bin/apriconv

# 编译安装 
 make && make install 

# 4.安装pcre
# 安装依赖 gcc-c++
yum install gcc-c++

# 解压
tar zxvf pcre-8.39.tar.gz
cd pcre-8.39/

# 配置
./configure --prefix=/usr/local/pcre-8.39

# 编译安装
make && make install

# 5.安装apache (httpd)
# 记录下apr, apr-util, apr-iconv , pcre 的安装路径, 配置apache时需要用到

# 安装并更新locate工具数据库
yum install locate  && updatedb

# 查找apr, apr-util,apr-iconv,pcre 安装路径
locate apr | grep bin
locate pcre | grep bin

# 查找结果如下:
# apr 安装路径 	/usr/local/apr-1.6.3/bin
# apr-iconv		 /usr/local/apr-iconv-1.2.2/bin/apriconv
# apr-util 安装路径 	/usr/local/apr-util-1.6.1/bin
# pcre 安装路径	/usr/local/pcre-8.39/bin

# 解压httpd
tar zxvf httpd-2.4.29.tar.gz

#  配置 (切换到解压目录) 一定要加上 enable-so 
cd httpd-2.4.29/
./configure --prefix=/usr/local/httpd-2.4.29/  --with-apr=/usr/local/apr-1.6.3/bin  --with-apr-util=/usr/local/apr-util-1.6.1/bin  --with-apr-iconv= /usr/local/apr-iconv-1.2.2/bin/apriconv   --with-pcre=/usr/local/pcre-8.39  --enable-so

# 编译安装
make && make install

# 查看安装成功没有
locate httpd | grep bin

# 添加到服务
# 从安装目录bin/下 复制apachectl 到/etc/rc.d/init.d/httpd
cp /usr/local/httpd-2.4.29/bin/apachectl /etc/rc.d/init.d/httpd
# 编辑httpd, 加入下面两句 后两个数字表示启动顺序, 不要超100, 下面两句是带# 注释的, chkconfig是能读到的, 这两个必须要加, Description: 这个是描述, 随便写

# chkconfig: 2345 80 81
# Description: this is httpd server

# 添加到守护进程
chkconfig --add httpd

# 管理 
service httpd start|restart|stop|status


# 访问



# 新建一个目录 /myconfig/ , 以后将所有配置文件建立软链接到此目录, 统一管理
mkdir /myconfig
# 为httpd.conf 创建软连接
ln -s /usr/local/httpd-2.4.29/conf/httpd.conf  /myconfig/httpd.conf


# 配置域名

# 运行下面几个命令测试一下有没有错误

# 解决 lynx: command not found
# 这是因为lynx命令不认识,只因缺少lynx包,安装即可:yum install lynx。
yum install lynx

# 安装完lynx , 运行service httpd status 有下面的提示, 该话题属于 apache server-status  , 这里不做多的说明, 不影响使用



# 启动后只要访问出现这个就说明安装apache 成功!

# 二. 安装php
# 1.安装php依赖
yum install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  zlib zlib-devel glibc glibc-devel glib2 glib2-devel libevent

# 2.安装php
# 解压 (切换到压缩包目录下执行)
tar zxvf php5.6.36.tar.gz

# 配置 配置开启需要开启的扩展比如,pdo, mysql gd 并将php做为apache的模块 --apxs2=指向apache bin下的apxs程序 
cd php-5.6.36/
./configure --prefix=/usr/local/php-5.6.36/ --with-apxs2=/usr/local/httpd-2.4.29/bin/apxs  --with-mysql   --with-pdo-mysql  --with-gd

# 更新apache的bin/apxs 文件 将第一行改为perl的位置
# 查看perl 位置
whereis perl 




# apxs 文件第一行改为 perl的位置 参数 -w
# ! /usr/bin/perl -w


#编译安装
make && make install

# 查看 php 信息
/usr/local/php-5.6.36/bin/php -m
# 如下说明安装成功


3.php与apache的绑定
编辑apache主配置文件 httpd.conf
配置如下:
1)
LoadModule php5_module modules/libphp5.so


2) 加入以下代码, 告知apache 将php交由php处理
<FilesMatch \.php$>
 SetHandler application/x-httpd-php
</FilesMatch>


如图:

# 在htdoc 站点目录写一个php测试文件 index.php 内容 <?php phpinfo();?>
# 重启服务器访问
service httpd restart 






# date 警告处理, 配置php时区



从phpinfo 获取到php的配置目录及文件 (/usr/local/php-5.6.36/lib)

# 拷贝php配置文件
从php源码中复制 php.ini-production 到php安装目录的lib目录下改名为php.ini
cp /root/packages/php-5.6.36/php.ini-production /usr/local/php-5.6.36/lib/php.ini

# 备份php.ini
cp /usr/local/php-5.6.36/lib/php.ini /usr/local/php-5.6.36/lib/php.ini.bak

# 创建软连接 方便管理
ln -s /usr/local/php-5.6.36/lib/php.ini /myconfig/php.ini

# 我把所有配置文件统一建立软连接在/myconfig/下, 如图

# 配置php.ini 时区

修改完, 重启服务器 再访问 
service httpd restart


# 三. 安装mysql
# 安装依赖
# gcc, gcc-c++, ncurses-devel, cmake(配置的工具mysql配置不用configure,用cmake)
yum install gcc gcc-c++ cmake ncurses-devel

# 安装boost mysql5.7依赖boost,mysql5.6不依赖
# 在/usr/local/下创建boost目录
mkdir /usr/local/boost
# 进入boost目录
cd /usr/local/boost/
# 下载 boost
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

# 解压
tar zxvf boost_1_59_0.tar.gz


# mysql官网下载mysql源码
https://dev.mysql.com/downloads/mysql/5.7.html#downloads


# 鼠标右键复制下载连接地址, 使用wget 下载
wget -c https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22.tar.gz

# 解压
tar zxvf mysql-5.7.22.tar.gz

# 配置安装位置与数据库data位置
# mysql 5.7需要指定 -DWITH_BOOST=/usr/local/boost, mysql5.6及以下不需要
cd mysql-5.7.22/
cmake . -DWITH_BOOST=/usr/local/boost   -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.22 -DMYSQL_DATADIR=/usr/local/mysql-5.7.22/data  

# 编译安装
make && make install

# 配置mysql
# 修改文件权限,要求必须用独立用户管理, 这个用户就叫mysql
# 添加用户
groupadd mysql && useradd -g mysql mysql


# 修改mysql程序权限, 把组改成mysql,用户也改成mysql
修改前:

# 在/usr/local/目录执行 
# 将mysql目录及文件的用户跟组修改为mysql
chown -R mysql:mysql mysql-5.7.22/


# 初始化用户信息前先删除/etc/my.cnf 配置文件
rm /etc/my.cnf

# 初始化用户信息
# 下面是不建议mysql5.7使用的, mysql5.6可以使用,具体看下面,选择自己的版本
# /usr/local/mysql-5.7.22/bin/mysql_install_db --user=mysql --datadir=/usr/local/mysql-5.7.22/data

# mysql5.6 使用下面的
# /scripts/mysql_install_db --user=mysql 

# mysql5.7 建议使用的
/usr/local/mysql-5.7.22/bin/mysqld  --initialize


# 初始化结束后, 会随机生成一个root的密码, 切记保持此密码,后续用到
如图:

本次生成的密码是: 1%fjXAMjDPb6 
# 查看data目录下有没有件, 有说明初始化成功了

# 初始化完成后, mysql目录下除了data目录保留mysql用户,把其它目录通通改为root用户
chown -R root mysql-5.7.22/ && chown -R mysql mysql-5.7.22/data/

# 查看

# 如果是mysql5.6 复制一个配置文件过来 参考

# 如果是mysqsl5.7 手动创建配置文件 touch /etc/my.cnf 写入以下内容,参考:
[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

[mysqldump]
quick

# 运行mysqld_safe服务
/usr/local/mysql-5.7.22/bin/mysqld_safe --user=mysql &

# 查看进程
ps -e | grep mysqld




# 连接
/usr/local/mysql-5.7.22/bin/mysql -uroot -p 


复制密码进去

按确定

# 修改密码
# mysql5.6 如下:
# update mysql.user set password=password('你的密码') where user='root';

# mysql5.7 如下:
alter user 'root'@'localhost' identified by '你的密码';

# 刷新权限 5.7不需要
# flush privileges
# quit 退出, 重新用新密码登录

# 将其加入守护进程
# 复制/mysqld.server 到/etc/rc.d/init.d/
cp  /usr/local/mysql-5.7.22/support-files/mysql.server /etc/rc.d/init.d/mysqld
# 修改权限
chmod  a+rx /etc/rc.d/init.d/mysqld 
# 添加到守护进程管理
chkconfig --add mysqld
# 查看
chkconfig --list mysqld
# 测试用守护进程管理方式,停用跟启用
service mysqld stop
service mysqld start

# 四. 安装phpmyadmin
# 下载
wget https://files.phpmyadmin.net/phpMyAdmin/4.8.1/phpMyAdmin-4.8.1-all-languages.zip
# 复制到站点根目录
cp phpMyAdmin-4.8.1-all-languages.zip /usr/local/httpd-2.4.29/htdocs/
# 进入站点根目录, 解压
cd /usr/local/httpd-2.4.29/htdocs/
unzip phpMyAdmin-4.8.1-all-languages.zip
# 改名为phpmyadmin
mv phpMyAdmin-4.8.1-all-languages phpmyadmin


# 访问站点 
http://58.87.95.128/phpmyadmin/index.php

如图:




输入密码登录


#解决一个问题 , 设置不让访问目录



# 编辑httpd.conf
Options Indexes FollowSymLinks
修改为:
Options FollowSymLinks

# 保存后, 重启httpd服务器
service httpd restart


# 访问


# 再配置httpd.conf, 让自动访问index.php


<IfModule dir_module>
     DirectoryIndex index.html index.php
</IfModule>

# 再次访问



LNMP搭建https://blog.csdn.net/Dong_Alex/article/details/80712018

/END


2017-10-13 11:40:01 jianjiacuncao 阅读数 741
  • 安卓编译与开发、Linux内核及驱动

    安卓编译与开发、Linux内核及驱动视频教程,该课程内容包括一、源码编译:1、常见的ROM种类、谷歌的ROM、第三方的ROM2、区别3、RockChip的ROM、4、编译环境配置、源码下载、编译命令;二、源码开发:源码结构分析、Launcher开发、需求分析、系统级应用;三、内核讲解:内核用途、内核结构、内核职能、内核源码编译、驱动开发;四、内核开发:1、体系架构、目录结构、中断机制、内核进程控制、2、内核库文件、例子简单分析、3、内核调度流程4、内核组件工具 嘉宾介绍:仝利,英文名Burning,CSDN博客讲师,多年主要从事于流媒体,网络通讯,p2p等技术的开发与研究。目前在创业,产品是面向企业会议室和家庭客厅的多媒体通讯盒子的开发。国内还没有相关产品,预计产品会在8月份上市。

    9278 人正在学习 去看看 CSDN讲师

第一章 安装

1. 采用源文件编译安装。源文件共两个,为:
subversion-1.6.1.tar.gz (subversion 源文件)
subversion-deps-1.6.1.tar.gz (subversion依赖文件)
注意文件版本必须一致,否则很容易产生各种奇怪的问题.

下载路径

    http://subversion.tigris.org/downloads/subversion-1.6.1.tar.bz2
    http://subversion.tigris.org/downloads/subversion-1.6.1.tar.gz
    http://subversion.tigris.org/downloads/subversion-1.6.1.zip


    http://subversion.tigris.org/downloads/subversion-deps-1.6.1.tar.bz2
    http://subversion.tigris.org/downloads/subversion-deps-1.6.1.tar.gz
    http://subversion.tigris.org/downloads/subversion-deps-1.6.1.zip

2. 上传以上两个文件到服务器上,解压。解压命令为:

 
1 tar xfvz subversion-1.6.1.tar.gz
2 tar xfvz subversion-deps-1.6.1.tar.gz

指令简介:tar 为解压命令,xfvz为tar命令的参数,用于解压tar.gz格式压缩的文件。
 
3. 解压后生成 subversion-1.6.1 子目录,两个压缩包解压后都会自动放到此目录下,不用手动更改。

4. 进入解压子目录:

1 cd subversion-1.6.1

5. 执行 ./configure –prefix=/opt/subversion 进行配置设定并指明安装目录. 注意prefix前是两个减号. 默认不带BDB包, 所以默认使用的是FSFS模式. 若想使用BDB模式需另外下载BDB包.建议使用FSFS模式.两种模式比较参考以下链接:

http://doc.iusesvn.com/show-21-1.html

指令简介:configure命令用于检查安装平台和目标特征,prefix用于指定路径。

6. 执行 make 编译.

7. 执行 make install 安装.

8. 添加环境变量:

1 vi /etc/profile

在文件最后加入:
SVNPATH=$PATH:/opt/subversion/bin
export SVNPATH

9. 测试SVN是否安装成功,执行:

1 svnserve --version

如果显示版本信息, 则安装成功.

第二章 配置

本系统采用为每个项目单独建一版本库的策略。配置文件,密码文件,访问控制文件等都放在版本库的conf目录下。所以每次开始一个新项目都必须新建一个版本库,并重新配置各配置文件。还有很重要的一条,要求各组员重新配置客户端,包括服务器版本库路径,本地路径等信息。

1. 建立版本库目录(可建立多个,新建库后以下各项都需重新配置。注意区别安装目录与版本库目录,以下讲的都是版本库目录)

1 mkdir –p /opt/svndata/repos

2. 建立svn版本库(与上面目录对应)

1 svnadmin create /opt/svndata/repos

执行此命令后svn自动在repos目录下添加必须的配置文件.
注意:版本库不同于一般的文件夹, 直接在操作系统上新建文件无法被SVN识别, 必须使用import等命令将文件导入版本库.
此为svn内部指令,create用于新建版本库。请使用svn help查看详细说明。

3. 修改版本库配置文件

1 vi /opt/svndata/repos/conf/svnserve.conf

各参数功能在配置文件的注释中有说明, 此处配置如下:
[general]
anon-access = none # 使非授权用户无法访问
auth-access = write # 使授权用户有写权限
password-db = /opt/svndata/repos/conf/pwd.conf # 指明密码文件路径
authz-db = /opt/svndata/repos/conf/authz.conf # 访问控制文件
realm = /opt/svndata/repos # 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
其它采用默认配置. 各语句都必须顶格写, 左侧不能留空格, 否则会出错.
其中pwd.conf 与 authz.conf 在新建版本库时系统不会自动创建,需要自己创建。
指令简介:这是svn配置文件的格式,请按照以上格式书写。

4. 配置用户

1 vi /opt/svndata/repos/conf/pwd.conf

输入以下内容:
[users]
username1 = password1
username2 = password2
可以添加多个,此为用户名密码对。

5. 配置权限
vi /opt/svndata/repos/conf/authz.conf
指令简介:此配置文件采用“基于路径的授权”策略,中括号里指定路径,以下列出对各用户的授权。包括只读r,读写rw。没有列出的用户,则不允许访问。还可以对用户分组,具体请参考svn手册,以下是简单例子:
[/opt/svndata/repos]
user1 = rw
user2 = r

6. 使用import导入文件
新建好的版本库是空的,需要导入工作目录。

1 $ svnadmin create /usr/local/svn/newrepos
2 $ svnimport mytree file:///usr/local/svn/newrepos/some/project

但是在导入后,用来的目录树并没有转换成工作拷贝,为了开始工作,还是需要运行svn checkout导出一个工作拷贝。因为导入后,文件在版本库中是以特殊的形式存在db文件夹中的,不能以明文的方式查看。必须使用svn checkout导出工作副本(workcopy)才能以正常方式查看。

1 svn checkout file:///usr/local/svn/newrepos/some/project workcopy

7. 启动服务
执行svnserve –d –r /opt/svndata/repos/ 启动服务, 以deamon方式运行。
本系统采用svnserve方式, 这是小团队项目的推荐方法. 这种方法维护最少, 配置最简单.
指令简介:此指令用于启动svn服务,-d指明以守护模式运行,svn自动在3690端口监听。3690是默认端口,可以使用“–listen-port=”或者“–listen-host=”来指定其它端口。-r选项用来指定svn服务的根目录,这样用户就可以使用相对路径访问,而不用提供完整路径。
使用以下命令检出:(svnserver方式)

1 svn checkout svn://127.0.0.1/dir

以上为示例。IP需要根据具体情况调整,dir为版本库路径,若在启动时已指定则可省略。
版本库信息在版本库文件夹里,所以要删除版本库只需要删除版本库所在的文件夹即可。
另外工作副本只是自己维护的文件夹,可以用Windows直接删掉,对别人没有影响。千万不要使用版本库的删除命令,否则版本库里的内容也会被删除。

 
MAC下SVN  可以试用HomeBrew 安装  http://subversion.apache.org/packages.html
2018-11-05 19:05:41 m0_37542524 阅读数 197
  • 安卓编译与开发、Linux内核及驱动

    安卓编译与开发、Linux内核及驱动视频教程,该课程内容包括一、源码编译:1、常见的ROM种类、谷歌的ROM、第三方的ROM2、区别3、RockChip的ROM、4、编译环境配置、源码下载、编译命令;二、源码开发:源码结构分析、Launcher开发、需求分析、系统级应用;三、内核讲解:内核用途、内核结构、内核职能、内核源码编译、驱动开发;四、内核开发:1、体系架构、目录结构、中断机制、内核进程控制、2、内核库文件、例子简单分析、3、内核调度流程4、内核组件工具 嘉宾介绍:仝利,英文名Burning,CSDN博客讲师,多年主要从事于流媒体,网络通讯,p2p等技术的开发与研究。目前在创业,产品是面向企业会议室和家庭客厅的多媒体通讯盒子的开发。国内还没有相关产品,预计产品会在8月份上市。

    9278 人正在学习 去看看 CSDN讲师

1,GCC所支持不同后缀名的处理方式

文件作用 后缀名 所对应的语言 编译流程
预处理文件 .c C原始程序 预处理、编译、汇编
.C/.cc/.cxx C++原始程序 预处理、编译、汇编
.m Objective C原始程序 预处理、编译、汇编
.h 预处理文件(头文件) (不常出现在指令行)
编译文件 .i 已经过预处理的C原始程序 编译、汇编
.ii 已经过预处理的C++原始程序 编译、汇编
汇编文件 .s/.S 汇编语言原始程序 汇编
链接文件 .o 目标文件 链接
.a/.so 编译后的库文件 链接

2,GCC编译流程分析

编译阶段 源文件 命令参数 目标文件 示例 参数解释
预处理阶段 .c -E .i/.ii(C代码) gcc -E test.c -o test.i -Wall -E:使编译器在预处理结束时就停止编译
.C/.cc/.cxx -o:制定GCC的输出结果
.m -Wall:(预处理阶段不起作用)
编译阶段 .i -S .s/.S(汇编代码) gcc -S test.i -o test.s -Wall -S:使编译器在编译结束后就停止
.ii -Wall:编译时打印出所有警告
汇编阶段 .s/.S -c .o(二进制代码) gcc -c test.s -o test.o -Wall
链接阶段 .o gcc test.o -o test.out
.a/.so

3,GCC链接阶段的参数解释

</tbody>
库路径 描述 参数 描述 举例 解释
相关路径 库文件不在系统默认路径下 -I<dir> 在头文件的搜索路径列表中添加<dir>目录 gcc hello.c -I/root/work/gcc -o hello 程序所需使用的库在"/root/work/gcc/"路径下
-L<dir> 在库文件的搜索路径列表中添加<dir>目录 gcc hello.c -I/root/work/gcc/lib-sunq-o -o hello 程序要链接"/root/work/gcc/"路径下的库"libsunq.so"
链接库 "/usr/lib"路径下的库文件文件 -l 指明具体使用的库文件 gcc hello.c -lm -o hello (Linux中函数库都以lib开头,因此-l后只需跟lib后的部分)有静态库文件"libm.a",调用时只需写"-lm"
-static 系统默认链接的是共享库。-static将禁止使用共享库 gcc hello.c -static -lm -o hello 系统中同时存在库名相同的静态库文件"libm.a"和动态库文件"libm.so",系统默认采用动态链接方式,若想使用静态库,则需加"-static"

4,静态库创建与使用

a,编写库源码hello.c

#include <stdio.h>
#include "hello.h"

void hello(void)
{
	printf("hello world\n");
	return 0;
}

b,给库源码编写头文件hello.h

#ifndef __HELLO_H__
#define __HELLO_H__

void hello(void);

#endi

c,编译生成目标文件hello.o

linux@linux:~/test/stdio/static_library$ gcc -c hello.c -Wall
linux@linux:~/test/stdio/static_library$ ls
hello.c  hello.h  hello.o

d,创建静态库hello

"libm.a"是库文件名,"m"是库名

linux@linux:~/test/stdio/static_library$ ar crs libhello.a hello.o
linux@linux:~/test/stdio/static_library$ ls
hello.c  hello.h  hello.o  libhello.a

e,使用nm,可以查看静态库中符号信息

linux@linux:~/test/stdio/static_library$ nm libhello.a 

hello.o:
00000000 T hello
         U puts

f,编写测试程序test.c

#include <stdio.h>
#include "hello.h"

int main(int argc, const char *argv[])
{
	hello();

	return 0;
}

g,编译test.c,并链接静态库libhello.a

linux@linux:~/test/stdio/static_library$ gcc test.c -o test.out -L. -lhello
linux@linux:~/test/stdio/static_library$ ls
hello.c  hello.h  hello.o  libhello.a  test.c  test.out
linux@linux:~/test/stdio/static_library$ ./test.out 
hello world

h,由于使用的是静态库,编译后相关代码已复制到可执行文件中。删除静态库,不影响程序执行

linux@linux:~/test/stdio/static_library$ ls
hello.c  hello.h  hello.o  libhello.a  test.c  test.out
linux@linux:~/test/stdio/static_library$ rm libhello.a 
linux@linux:~/test/stdio/static_library$ ls
hello.c  hello.h  hello.o  test.c  test.out
linux@linux:~/test/stdio/static_library$ ./test.out 
hello world
2019-07-23 16:19:16 weixin_44023707 阅读数 61
  • 安卓编译与开发、Linux内核及驱动

    安卓编译与开发、Linux内核及驱动视频教程,该课程内容包括一、源码编译:1、常见的ROM种类、谷歌的ROM、第三方的ROM2、区别3、RockChip的ROM、4、编译环境配置、源码下载、编译命令;二、源码开发:源码结构分析、Launcher开发、需求分析、系统级应用;三、内核讲解:内核用途、内核结构、内核职能、内核源码编译、驱动开发;四、内核开发:1、体系架构、目录结构、中断机制、内核进程控制、2、内核库文件、例子简单分析、3、内核调度流程4、内核组件工具 嘉宾介绍:仝利,英文名Burning,CSDN博客讲师,多年主要从事于流媒体,网络通讯,p2p等技术的开发与研究。目前在创业,产品是面向企业会议室和家庭客厅的多媒体通讯盒子的开发。国内还没有相关产品,预计产品会在8月份上市。

    9278 人正在学习 去看看 CSDN讲师

简介

Linux上几乎所有的软件都经过了 GPL 授权,因此几乎所有的软件都会提供源码。
而一个软件要在 Linux 上执行,必须是二进制文件,因此当我们拿到软件源码后,需要将它编译成二进制文件才能在 Linux 上运行。

开源程序源码包获取方式

1.官方自建站点
比如:apache.orgmariadb.org
2.代码托管
SourceForge
Github.com
code.google.com

软件编译过程

将源码编译成可供Linux运行的二进制文件一共需要两步:
1.使用gcc编译器将源码编译成目标文件
2.再次使用gcc编译器将目标文件链接成二进制文件

这过程看似简单,一个软件的源代码往往被封装在多个源文件中,此处这些文件有错综复杂的依赖关系,编译需要严格按照指定的顺序进行,这无疑增加了编译的难度。好在make命令可以帮助我们简化编译过程。整个编译过程被浓缩在Makefile文件中(告诉make命令需要怎么去编译和链接程序)当执行make命令时,make会去当前目录中寻找Makefile文件,并根据该文件中的要求完成整个编译过程。
而Makefile文件由configure命令产生。当执行configure命令时,configure会根据当前系统环境动态生成一个适合本系统的Makefile文件,供make命令使用。
在这里插入图片描述
configure、Makefile.in 一般是项目管理器自动生成的,这依赖于两个开发工具:
(1)autoconf:生成configure脚本文件
autoconf需要结合一个配置文件来和其他命令生成configure脚本;这个配置文件告诉autoconf当前代码有哪些特性、指定哪些安装路径等,而后才能生成configure脚本
(2)automake:生成Makefile.in模板文件
automake也要结合一个文件,这个指明有多个程序文件、它们的依赖关系是什么、以及使用哪一种版本的编译器等,而后才能生成Makefile.in

注意:在安装之前查看INSTALL和README文件查看安装方法,因为不同程序包安装步骤不一样,有的程序包不需要configure,直接make后执行make install;而有的程序包不需要make install,只有一个二进制文件直接复制即可完成。

编译C源代码

前提:提供开发工具及开发环境
开发工具:make、gcc等
开发环境:开发库、头文件、glibc标准库

安装开发组件

想要进行编译,提前安装开发组件
Centos 6:Development Tools、Server Platform Development
Centos 7:Development Tools、Development and Creative Workstation

Linux源码安装步骤

一、
	(1)获取源码
	将软件的源码下载至/usr/local/,并解压
	
	(2)查看INSTALL与README文件
	解压后查看INSTALL与README文件,这两个文件中详细介绍了本软件的安装方法和注意事项
	
	(3)创建Makefile文件(./configure)
		--help:获取支持使用的选项
		执行configure命令,检测当前编译环境,生成Makefile文件。
		在执行make命令之前,用户指定程序包的编译参数、启用特性、安装路径等等
		configure脚本会收集当前系统上的开发环境中所依赖各组件的版本、特性等,并检查所依赖的环境是否能满足,如果检查到所依赖的程序包不存在立即报错,无法执行下一步。最后根据用户指定的信息和Makefile.in文件生成一个Makefile文件
		通用选项:
			安装路径设置
				--prefix=/PATH/TO/SOMEWHERE :指定安装的路径;默认为/usr/local/
				--sysconfdir=/PATH/TO/SOMEWHERE :指定配置文件目录
			Optional Features:可选特性(每个程序包的可选特性不一样建议./config --help 查看)
				--enable-feature :启用某个特性
				--disable-feature :关闭某个特性
			Optional Packages:依赖的程序包
				--with-PACKAGE:表示依赖的包,不指明路径,编译安装时会到默认路径下找
				--without-PACKAGE:不依赖的包
	
	(4)编译(make)
	执行make clean;make命令将源码编译成二进制文件。
	每个源代码都有专用的makefile,在make时依据这个配置文件,调用指定的预处理器做处理、调用指定的编译器做处理、编译文件的顺序等操作等
	注意:make clean命令用来清除上一次编译生成的目标文件。这个步骤可有可无,但为了确保编译的成功,还是加上为好。防止由于软件中含有残留的目标文件导致编译失败。

	(5)安装(make install)
	执行make install命令将上一步编译好的二进制文件安装到指定的目录中去。
	其实是一些脚本,实现把构建出的应用程序,分别分配到用户指定的目录中;如创建出二进制文件放到指定的二进制目录、库文件放到指定的库目录等等,使用install拷贝命令也能实现

二、
	安装后的配置
	(1)将二进制程序目录添加至PATH文件变量中,否则只能使用绝对路径才能运行程序
	编辑文件/etc/profile.d/NAME.sh
	export PATH=/PATH/TO/BIN:$PATH
	
	(2)导出库文件路径
	编辑/etc/ld.so.conf/NAME.conf,添加新的库文件所在的目录至此文件中
	例如:/usr/local/apache2/lib
	
	ldconfig -v:重新加载库文件路径,并查看
	ldconfig -p:查看已经加载所有库文件路径
	
	(3)导出头文件
	/usr/include/目录下,创建软链接;
	ln -s target_dir soft_link    #可以导出一个目录为所有文件链接,也可以为每一个头文件导出一个链接,然后把创建的链接输出到/usr/include/目录下,或直接复制头文件至/usr/include/目录
	
	(4)导出man手册
	Centos 7是在/etc/man_db.conf的40到50行之间,添加一个MANPATH参数(Centos6可能是/etc/man.config);
	MANPATH_MAP /usr/local/apache2/bin /usr/local/apache2/man

建议

运维时,建议把程序包放到/usr/local/src下,方便其他管理员管理代码
Linux的软件安装目录也是有讲究的,理解这一点,在对系统管理员是有益的(强迫症使我完全不能接受不正确的路径选择,看着不舒服…)
/usr:系统级目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32
/usr/local:用户级别的目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。
/opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(游戏),当你不需要时,直接rm -rf删掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用

源码放哪里?
/usr/src:系统级的源码目录
/usr/local/src:用户级的源码目录

2013-07-31 19:58:11 gogoky 阅读数 743
  • 安卓编译与开发、Linux内核及驱动

    安卓编译与开发、Linux内核及驱动视频教程,该课程内容包括一、源码编译:1、常见的ROM种类、谷歌的ROM、第三方的ROM2、区别3、RockChip的ROM、4、编译环境配置、源码下载、编译命令;二、源码开发:源码结构分析、Launcher开发、需求分析、系统级应用;三、内核讲解:内核用途、内核结构、内核职能、内核源码编译、驱动开发;四、内核开发:1、体系架构、目录结构、中断机制、内核进程控制、2、内核库文件、例子简单分析、3、内核调度流程4、内核组件工具 嘉宾介绍:仝利,英文名Burning,CSDN博客讲师,多年主要从事于流媒体,网络通讯,p2p等技术的开发与研究。目前在创业,产品是面向企业会议室和家庭客厅的多媒体通讯盒子的开发。国内还没有相关产品,预计产品会在8月份上市。

    9278 人正在学习 去看看 CSDN讲师
linux下编译源文件makefile文件的简单总结:

Linux系统下的gcc(GNU CCompiler)是GNU推出的功能强大、性能优越的多平台编译器,
是GNU的代表作之一。gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编
译器相比平均效率要高20%~30%。

GCC编译器能将C、C++语言源程序、汇编程序编译、链接成可执行文件。
在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行
文件和不可执行文件。

使用GCC编译程序时,编译过程可以被细分为四个阶段:

v预处理(Pre-Processing)    // 此阶段主要是在库中找到所需要的头文件,包含到文件中来;  
v编译(Compiling),    //检查文件中的语法,语句的错误;
v汇编(Assembling),    //翻译成机器语言;
v链接(Linking),    

Gcc通过后缀来区别输入文件的类别:
v .c为后缀的文件: C语言源代码文件
v .a为后缀的文件: 是由目标文件构成的库文件
v .C,.cc或.cxx 为后缀的文件:是C++源代码文件
v .h为后缀的文件: 头文件
v .i 为后缀的文件: 是已经预处理过的C源代码文件
v .ii为后缀的文件: 是已经预处理过的C++源代码文件
v .o为后缀的文件: 是编译后的目标文件
v .s为后缀的文件: 是汇编语言源代码文件
v .S为后缀的文件: 是经过预编译的汇编语言源代码文件。



gcc最基本的用法是∶
gcc [options] [filenames]
options:编译器所需要的编译选项
filenames: 要编译的文件名

  -c多该程序制作编译,不做链接;
 
  -I指定include file的查找目录;
  -L指定library file的查找目录;
  -Wall编译文件时发出所有的警告信息;
  -c:只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。
  -Wall:生成所有警告信息
  -w:不生成任何警告信息
  -DMACRO: 定义 MACRO 宏,等效于在程序中使用#define MACRO
  -g:产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

例如:
hello.c:
#include <stdio.h>
int main(void)
{
    printf (Hello world!\n);
    return 0;
}


编译和运行这段程序:
# gcc hello.c -o hello
# ./hello

输出:Hello world!

1.如果是简单的*.C文件,
    (1)命令:gcc -o  run file.c  或者  gcc file.c -o run
    如果编译通过,此时运行./run就能执行该文件了;
    (2)命令:gcc -o file.c
    如果编译通过,运行a.out就能执行该文件了;
      -o指定输出的文件名,如果没有指定文件名,默认的执行命令是a.out;
 
-O,对程序进行优化编译、链接,采用这个选
项,整个源代码会在编译、连接过程中进行优
化处理,这样产生的可执行文件的执行效率可
以提高,但是,编译、连接的速度就相应地要
慢一些。
-O2,比-O更好的优化编译、连接,当然整个
编译、连接过程会更慢。

编译命令:
以file.c为例:

1. gcc file.c -o runfile      //优化代码;
 ./runfile
2. gcc –O file.c -o runfile   //对文件更好的进行优化;编译的慢但是效率高;
 ./runfile



-Idirname: 将dirname所指出的目录加入到程序头文件目录列表
中。
C程序中的头文件包含两种情况∶
v #include <A.h>
v #include “B.h”
对于<>,预处理程序cpp在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;

而对于””,cpp在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。

例:gcc foo.c -I /home/include -o foo     //先在当前目录下查找,如果没有就到库里去查找;

-Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接
程序ld在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首
先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。


-lname:在连接时,装载名字为
“libname.a”的函数库,该函数库位于
系统预设的目录或者由-L选项确定的目
录下。例如,-lm表示连接名为
“libm.a”的数学函数库。
例:gcc foo.c -L /home/lib -lfoo -o foo

-static:静态链接库文件
例:gcc –static hello.c -o hello
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。
例如:libhello.so libhello.a。当使用静态库时,连接器找出程序所需的函数,然后将它们拷贝到可执行文件,一旦连
接成功,静态程序库也就不再需要了。然 而,对动态库而言,就不是这样,动态库会在执行程序内留下一个标记‘指明当程序
执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的 缺省操作是首先连接动态库。
演示:静态链接与动态链接可执行文件大小比较





opencv在Linux环境下的源码编译

博文 来自: qq_42425882
没有更多推荐了,返回首页