2008年12月1日星期一

intel面试

昨天去Intel面试去了,4面,2个多小时.一面不好,几个问题回答的不对也不到位.估计录用的可能性为0.有点伤心.还有我的英语太烂.....

2008年11月18日星期二

父进程和子进程

父进程和子进程
一、子进程的创建
进程创建方式有三种:fork,clone,vfork。fork用于普通进程的创建,采用Copy on Write方式;vfork是完全共享的创建;clone界于两者之间,创建方式比较灵活。真正创建进程的是函数int do_fork(unsigned long clone_flags,unsigned long usp,struct pt_regs *regs)。这里只讲fork方式的创建。
#include
pid_t fork(void);
该函数负责创建一个子进程,它将子进程的tsk_struct中exit_signal域的值设为SIGCHLD。
创建子进程的代码模式为:
...
if((chld_pid = fork() < 0)){ /** Create the child process by fork() */
/** Error has occured,no child process is created.For details,see 'errno'. */
}else if(chld_pid == 0){
/** Returned in the child.So it is child process code here. */
}else if(chld_pid > 0){
/** Returned in the parent process.So it is parent process code here. */
}
...
二、子进程的死亡
进程终止的大致过程为:子进程调用exit函数将自身设为僵死状态并退出;父进程调用wait函数处理处于僵死状态的子进程,将其从内存中彻底清除。

1、exit函数
exit函数调用内核函数sys_exit,而sys_exit则直接调用do_exit函数。所以真正完成exit工作的是函数do_exit。
do_exit函数的原型为
NORET_TYPE void do_exit(long code)
code是进程的退出代码。
do_exit所做的工作为:
1)取出当前进程
2)如果当前进程在中断处理程序中,则不可终止
3)如果当前进程为0号进程(init_task)则不可终止
4)设置进程的标志为正在终止
tsk->flags |= PF_EXITING;
5)释放大部分资源(时钟队列、信号灯结构、虚拟内存空间、文件结构、文件系统结构、信号处理结构、退出线程)
6)设置进程的状态为僵死状态:
tsk->state = TASK_ZOMBIE;
7)设置退出代码:
tsk->exit_code = code;
8)向有关进程发送信号,通知它们自己要终止(exit_notify)。
9)调度调度函数schedule,放弃cpu。因为进程的当前状态为僵死状态,所以调度函数将其从运行队列中删除,进程不会再有运行的机会。

僵死进程的特点:进程永远不会再运行;但其task_struct结构还在内存中。
2、wait函数
父进程收到子进程终止信号后,调用wait函数处理僵死进程,真正完成这个工作的是函数sys_wait4。
该函数原型为
int sys_wait4(pid_t pid,unsigned int * stat_addr,int options,struct rusage * ru)
sys_wait4的工作为:
1)如果能够找到満足条件的僵死子进程,则将其释放,然后返回进程的pid。
2)如果能够找到満足要求的但并没有僵死,则或者立刻返回(options中设有标志WNOHANG或者有等待处理的其它信号);或者等待。
3)如果无法找到满足要求的则返回出错代码 -ECHLD。
task_struct结构的回收由函数release(struct task_struct *p)完成。

2008年11月9日星期日

字节对齐详解

本文引用自:http://www.yuanma.org/data/2006/0723/article_1213.html

一.什么是字节对齐,为什么要对齐?

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。
二.字节对齐对程序的影响:

先让我们看几个例子吧(32bit,x86环境,gcc编译器):
设结构体如下定义:
struct A
{
int a;
char b;
short c;
};
struct B
{
char b;
int a;
short c;
};
现在已知32位机器上各种数据类型的长度如下:
char:1(有符号无符号同)
short:2(有符号无符号同)
int:4(有符号无符号同)
long:4(有符号无符号同)
float:4 double:8
那么上面两个结构大小如何呢?
结果是:
sizeof(strcut A)值为8
sizeof(struct B)的值却是12

结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个,B也一样;按理说A,B大小应该都是7字节。
之所以出现上面的结果是因为编译器要对数据成员在空间上进行对齐。上面是按照编译器的默认设置进行对齐的结果,那么我们是不是可以改变编译器的这种默认对齐设置呢,当然可以.例如:
#pragma pack (2) /*指定按2字节对齐*/
struct C
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(struct C)值是8。
修改对齐值为1:
#pragma pack (1) /*指定按1字节对齐*/
struct D
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(struct D)值为7。
后面我们再讲解#pragma pack()的作用.
三.编译器是按照什么样的原则进行对齐的?

先让我们看四个重要的基本概念:
1.数据类型自身的对齐值:
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
3.指定对齐值:#pragma pack (value)时的指定对齐值value。
4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。
有 了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是 表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0".而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是数 据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整数 倍,结合下面例子理解)。这样就不能理解上面的几个例子的值了。
例子分析:
分析例子B;
struct B
{
char b;
int a;
short c;
};
假 设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指定 对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为4, 所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐值为 2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的 都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求, 0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B 共有12个字节,sizeof(struct B)=12;其实如果就这一个就来说它已将满足字节对齐了, 因为它的起始地址是0,因此肯定是对齐的,之所以在后面补充2个字节,是因为编译器为了实现结构数组的存取效率,试想如果我们定义了一个结构B的数组,那 么第一个结构起始地址是0没有问题,但是第二个结构呢?按照数组的定义,数组中所有元素都是紧挨着的,如果我们不把结构的大小补充为4的整数倍,那么下一 个结构的起始地址将是0x0000A,这显然不能满足结构的地址对齐了,因此我们要把结构补充成有效对齐大小的整数倍.其实诸如:对于char型数据,其 自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,这些已有类型的自身对齐值也是基于数组考虑的,只 是因为这些类型的长度已知了,所以他们的自身对齐值也就已知了.
同理,分析上面例子C:
#pragma pack (2) /*指定按2字节对齐*/
struct C
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
第 一个变量b的自身对齐值为1,指定对齐值为2,所以,其有效对齐值为1,假设C从0x0000开始,那么b存放在0x0000,符合0x0000%1= 0;第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续 字节中,符合0x0002%2=0。第三个变量c的自身对齐值为2,所以有效对齐值为2,顺序存放
在0x0006、0x0007中,符合 0x0006%2=0。所以从0x0000到0x00007共八字节存放的是C的变量。又C的自身对齐值为4,所以C的有效对齐值为2。又8%2=0,C 只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8.
四.如何修改编译器的默认对齐值?

1.在VC IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改,默认是8字节。
2.在编码时,可以这样动态修改:#pragma pack .注意:是pragma而不是progma.
五.针对字节对齐,我们在编程中如何考虑?


如果在编程的时候要考虑节约空间的话,那么我们只需要假定结构的首地址是0,然后各个变量按照上面的原则进行排列即可,基本的原则就是把结构中的变量按照 类型大小从小到大声明,尽量减少中间的填补空间.还有一种就是为了以空间换取时间的效率,我们显示的进行填补空间进行对齐,比如:有一种使用空间换时间做 法是显式的插入reserved成员:
struct A{
char a;
char reserved[3];//使用空间换时间
int b;
}

reserved成员对我们的程序没有什么意义,它只是起到填补空间以达到字节对齐的目的,当然即使不加这个成员通常编译器也会给我们自动填补对齐,我们自己加上它只是起到显式的提醒作用.
六.字节对齐可能带来的隐患:

代码中关于对齐的隐患,很多是隐式的。比如在强制类型转换的时候。例如:
unsigned int i = 0x12345678;
unsigned char *p=NULL;
unsigned short *p1=NULL;

p=&i;
*p=0x00;
p1=(unsigned short *)(p+1);
*p1=0x0000;
最后两句代码,从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。
在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error,因为它们要求必须字节对齐.
七.如何查找与字节对齐方面的问题:

如果出现对齐或者赋值问题首先查看
1. 编译器的big little端设置
2. 看这种体系本身是否支持非对齐访问
3. 如果支持看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来标志其特殊访问操作。

八.相关文章:转自http://blog.csdn.net/goodluckyxl/archive/2005/10/17/506827.aspx

ARM下的对齐处理
from DUI0067D_ADS1_2_CompLib

3.13 type qulifiers

有部分摘自ARM编译器文档对齐部分

对齐的使用:
1.__align(num)
这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时
就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。
这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节
对齐,但是不能让4字节的对象2字节对齐。
__align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。

2.__packed
__packed是进行一字节对齐
1.不能对packed的对象进行对齐
2.所有对象的读写访问都进行非对齐访问
3.float及包含float的结构联合及未用__packed的对象将不能字节对齐
4.__packed对局部整形变量无影响
5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定
义为packed。
__packed int* p; //__packed int 则没有意义
6.对齐或非对齐读写访问带来问题
__packed struct STRUCT_TEST
{
char a;
int b;
char c;
} ; //定义如下结构此时b的起始地址一定是不对齐的
//在栈中访问b可能有问题,因为栈上数据肯定是对齐访问[from CL]
//将下面变量定义成全局静态不在栈上
static char* p;
static struct STRUCT_TEST a;
void Main()
{
__packed int* q; //此时定义成__packed来修饰当前q指向为非对齐的数据地址下面的访问则可以

p = (char*)&a;
q = (int*)(p+1);

*q = 0x87654321;
/*
得到赋值的汇编指令很清楚
ldr r5,0x20001590 ; = #0x12345678
[0xe1a00005] mov r0,r5
[0xeb0000b0] bl __rt_uwrite4 //在此处调用一个写4byte的操作函数

[0xe5c10000] strb r0,[r1,#0] //函数进行4次strb操作然后返回保证了数据正确的访问
[0xe1a02420] mov r2,r0,lsr #8
[0xe5c12001] strb r2,[r1,#1]
[0xe1a02820] mov r2,r0,lsr #16
[0xe5c12002] strb r2,[r1,#2]
[0xe1a02c20] mov r2,r0,lsr #24
[0xe5c12003] strb r2,[r1,#3]
[0xe1a0f00e] mov pc,r14
*/

/*
如果q没有加__packed修饰则汇编出来指令是这样直接会导致奇地址处访问失败
[0xe59f2018] ldr r2,0x20001594 ; = #0x87654321
[0xe5812000] str r2,[r1,#0]
*/
//这样可以很清楚的看到非对齐访问是如何产生错误的
//以及如何消除非对齐访问带来问题
//也可以看到非对齐访问和对齐访问的指令差异导致效率问题
}

2008年10月29日星期三

Android SDK -- Developing Android Applications with Other IDEs and Tools

Developing Android Applications with Other IDEs and Tools
使用其它工具开发Android应用程序(Apache ant)

The recommended way to develop an Android application is to use Eclipse with the ADT plugin. This plugin provides editing, building, and debugging functionality integrated right into the IDE.

推荐的开发方式为Eclipse加ADT插件。ADT插件提供编辑、编译和调试功能并整合到IDE环境中。

However, if you'd rather develop your application in another IDE, such as IntelliJ, or use Eclipse without the ADT plugin, you can do that instead. The SDK provides the tools you need to set up, build, and debug your application.

如果你更愿意使用其它IDE,也是可以的。SDK提供工具来建立、调试你的应用程序。

Creating an Android Project

创建一个Android工程

The Android SDK includes activityCreator, a program that generates a number of stub files for your project, as well as a build file. You can use the program to create an Android project for new code or from existing code, such as the sample applications included in the SDK. For Linux and Mac, the SDK provides activityCreator.py, a Python script, and for Windows, activityCreator.bat, a batch script. Regardless of platform, you can use activityCreator in the same way.

activityCreator是SDK提供的一个用于生成一系列stub files(桩文件)的程序。你可以使用它创建一个新工程或从已存在的code创建一个工程(比如SDK提供的sample)。对linux或Mac而言,activityCreator是一个Python脚本。

To run activityCreator and create an Android project, follow these steps:

使用activityCreator创建一个工程的过程如下:
1. In the command line, change to the tools/ directory of the SDK and create a new directory for your project files. If you are creating a project from existing code, change to the root folder of your application instead.

1、打开一个终端,切换${Android_SDK_DIR}/tools为当前工作目录,为你的工程创建一个目录(mkdir)这里假设为./helloActivity。如果你是为一个已存在的code创建一个工程,可以切换到该code的根目录下(不建议这样做,我的观点是只要是新工程都应该拥有一个新目录,至于code,可以拷贝过去)。

2. Run activityCreator. In the command, you must specify a fully-qualified class name as an argument. If you are creating a project for new code, the class represents the name of a stub class that the script will create. If you are creating a project from existing code, you must specify the name of one Activity class in the package. Command options for the script include:

2、运行activityCreator。格式为activityCreator --out Project_Dir Your.Package.Name.ActivityName
例子如下:
liangtaohy@tools/# activityCreator --out helloActivity com.example.android.helloactivity

Package: com.example.android
Output directory: helloActivity
Activity name: helloactivity
Created directory /home/liangtaohy/sys/Android/android-sdk-linux_x86-1.0_r1/tools/helloActivity/src/com/example/android
Added file helloActivity/src/com/example/android/helloactivity.java
Created directory /home/liangtaohy/sys/Android/android-sdk-linux_x86-1.0_r1/tools/helloActivity/bin
Created directory /home/liangtaohy/sys/Android/android-sdk-linux_x86-1.0_r1/tools/helloActivity/libs
Created directory /home/liangtaohy/sys/Android/android-sdk-linux_x86-1.0_r1/tools/helloActivity/res/values
Added file helloActivity/res/values/strings.xml
Created directory /home/liangtaohy/sys/Android/android-sdk-linux_x86-1.0_r1/tools/helloActivity/res/layout
Added file helloActivity/res/layout/main.xml
Added file helloActivity/AndroidManifest.xml
Added file helloActivity/build.xml
activityCreator脚本生成如下的一些文件:
* AndroidManifest.xml:应用程序的manifest文件
* build.xml:一个Ant文件,通过它你可以build/package应用程序
* src/your/package/name/ActivityName.java:由你在命令行参数中指定的Activity类
* res/:资源存放目录
* src/:源文件目录
* bin/:build脚本生成的文件的存放目录

Building an Android Application
build一个Android应用程序

Use the Ant build.xml file generated by activityCreator to build your application.
使用命令ant build.xml来build你的应用程序,其中build.xml由activitycreator生成。
1.If you don't have it, you can obtain Ant from the Apache Ant home page. Install it and make sure it is on your executable path.
1、如果你没有安装ant工具,请访问http://ant.apache.org/。安装完后,请确认它在你的当前PATH中。

2.Before calling Ant, you need to declare the JAVA_HOME environment variable to specify the path to where the JDK is installed.
2、在运行命令ant之前,你需要声明JAVA_HOME环境变量,把它指定为你的JDK安装目录即可。

3.If you have not done so already, follow the instructions for Creating a New Project above to set up the project.

4.You can now run the Ant build file by simply typing ant in the same folder as the build.xml file for your project. Each time you change a source file or resource, you should run ant again and it will package up the latest version of the application for you to deploy.
4、在build.xml所在的目录下运行命令ant即可build你的project。

Running an Android Application
运行一个Android应用程序

To run a compiled application, you will upload the .apk file to the /data/app/ directory in the emulator using the adb tool as described here:
要运行一个编译过的应用程序,你需要上传.apk文件到模拟器的/data/app目录。adb工具帮助你完成此事。

1. Start the emulator (run /tools/emulator from the command line)
启动emulator
2. On the emulator, navigate to the home screen (it is best not to have that application running when you reinstall it on the emulator; press the Home key to navigate away from that application).
导航emulator到home界面下。
3. Run adb install myproject/bin/.apk to upload the executable. So, for example, to install the Lunar Lander sample, navigate in the command line to /sample/LunarLander and type ../../tools/adb install bin/LunarLander.apk
运行命令adb install /bin/.apk上传执行文件。
4. In the emulator, open the list of available applications, and scroll down to select and start your application.
进入emulator,打开应用程序列表,选择并运行你的应用程序。

2008年10月22日星期三

给内核打补丁

比如我的内核是2.6.25.1,补丁的版本为2.6.25.2,则可用下列命令打补丁:
#cd /usr/src/linux
patch -p 1 < patch-2.6.25.2

2008年10月21日星期二

gvfs-fuse-daemon困惑

我在学习linux系统管理时,使用命令df -T -h看到如下输出:

文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda8 ext3 31G 12G 17G 42% /
udev tmpfs 489M 112K 489M 1% /dev
/dev/sda1 ntfs 20G 8.5G 12G 44% /mnt/windows/c
/dev/sda5 ntfs 30G 5.7G 24G 20% /mnt/windows/d
/dev/sda6 vfat 15G 12G 2.8G 82% /mnt/windows/e
/dev/sda7 vfat 54G 20G 35G 36% /mnt/windows/f
df: “/var/lib/gdm/.gvfs”: 权限不够
gvfs-fuse-daemon
fuse.gvfs-fuse-daemon 31G 12G 17G 42% /home/liangtaohy/.gvfs

对gvfs-fuse-daemon很是困惑!它似乎是一个设备,挂在/home/liangtaohy/.gvfs上,占用的空间和/的完全相同!
我在IRCnet#linux channel中获得的解释是:
Gvfs is a userspace virtual filesystem where mount runs as a separate processes which you talk to via dbus. It also contains a gio module that seamlessly adds gvfs support to all applications using the gio API. It also supports exposing the gvfs mounts to non-gio applications using fuse.

大致理解为:gvfs是一个虚拟文件系统,mount在其上可以作为一个独立的进程与via dbus通讯。同时gvfs也包含一个Gio模块(gio是一个共享库,属于glib)。Gio负责提供操作gvfs的API接口。gvfs通过fuse支持非gio的应用。
gvfs支持sftp,ftp,smb,WebDAV,ObexFTP等。
gvfs的一个简单应用是挂载ftp到本地目录~/.gvfs上,如北邮人的software.edu.cn。截图如下:


图中的Nautilus版本为2.22.2

2008年10月19日星期日

2008年10月17日星期五

安装Thunderbird

OpenSUSE 11.0 下安装Thunderbird

比较喜欢这个Mail client,Windows下我也用这个。它的安装很简单。
1、下载Thunderbird,网址为:
www.mozilla.org.cn/thunderbird/
我下载的是2.0.0.9 for Linux i686,Chines(Simplified)(11MB)
2、解压
tar -zxvf thunderbird-2.0.0.9.tar.gz
mv thunderbird /usr/local/
3、创建启动器
这个很简单,桌面点右键。。。。

2008年9月20日星期六

opensuse 11下安装audacious-1.5.1

2008年09月20日我成功安装了audacious,Input Plugin为Flac Audio Plugin,Monkey's Audio Plugin,MPEG Audio Plugin,MPEG 4 Audio Plugin,WMA Plugin等。这样就可以听APE,Flac和mp3了。wma的我基本不听。以下是我的笔记。
环境:openSuSe 11
安装方式:Source code(因为suse的源太少了)
所需文件:
--audacious-1.5.1.tgz The Latest Release(http://audacious-media-player.org/)
--audacious-plugins-1.5.1.tgz The Latest Release(http://audacious-media-player.org/)
--flac-1.2.1.tar.gz (Input Plugin for Flac)
--libmad-0.15.1b.tar.gz (Input Plugin for Mp3)
--libmcs-0.7.1.tgz (audacious)
--libmowgli-0.7.0.tgz (audacious)
--libogg-1.1.3.tar.gz (Input Plugin for ogg vorbis)
--libvorbis-1.2.0.tar.gz (Input Plugin for ogg vorbis)

相关站点:
--http://distfiles.atheme.org/ 提供audacious,audacious-plugin的所有版本,以及相关的lib,均为源码包。
--http://www.xiph.org/downloads/ 开源社区,我在上面下载的libogg,libvorbis,libflac
--ftp://ftp.mars.org/pub/mpeg/ 我在上面下载的libmad
安装步骤:
1、有效利用configure
cd audacious-1.5.1
./configure
configure非常有用,它的Error告诉你安装audacious所需的lib文件,我的少libmcs,libmowgli
2、安装libmcs和libmowgli
cd libmcs-0.7.1
less README
读README后你会知道如何安装,这两个很简单
./configure
make
make install
3、安装audacious-1.5.1
我认真阅读了README和INSTALL两个文件。然后如下配置
./configure --enable-largefile ...其他的忘了。
make
make install
4、查看audacious-plugins-1.5.1自带的插件(利用config.log)
./configure
成功后,configure会给出一个列表,指出包含的插件,示例如下
Input Plugins
-------------
MPEG 1/2/3 (madplug): no
MPEG 4 Audio (AAC): yes
Windows Media Audio (wma): yes
Monkey's Audio (ape): yes
Module decoder (modplug): yes
MIDI modular plugin (amidi-plug): no
-> ALSA backend: auto
-> FluidSynth backend: auto
-> dummy backend: auto
MIDI to WAVE converter (timidity): yes
CD Digital Audio (cdaudio_ng): no
sndfile extensions: no
Tone Generator: yes
Ogg Vorbis (vorbis): yes
Free Lossless Audio Codec (flacng): no
Commodore 64 audio (sid): no
Game music (spc, nsf & gbs): yes
PlayStation audio (sexypsf): yes
AdLib synthesizer (adplug): no
Apple Lossless Audio Codec (alac): yes
WavPack 4.31+ (wavpack): no
Musepack support (musepack): no
查找madplug,flacng,ape发现仅ape为yes。查看config.log会发现如下一句:
configure:8641: checking for libmad /* 检查libmad是否存在 */
result为no。所以需要安装libmad,flacng也是同样的情况。至于安装到什么地方,这里先不问这个。先安装,再说。
5、安装libmad-0.15.1b,flac-1.2.1
安装步骤请查阅README或INSTALL文件
6、回到audacious-plugins-1.5.1目录,再次./configure,查找madplug,flacng均为yes。
现在可以make,make install了。
7、在终端中运行audacious,发现error,好像是can't open file,libmcs.so.1 不存在。解决办法是将libmcs.so.1.0.0拷贝到/usr/lib中,这可能是因为audacious从/usr/lib中找此动态库导致的,具体原因没研究。
8、记得心上过程中出现过一个错误,由于我健忘,不记得是装什么了,错误是"-fforce-mem"不存在的选项,这是gcc版本问题,目前的gcc取消了此选项,此选项是个优化选项,我找到Makefile,直接去掉此选项了。