在Linux环境下编写和使用静态函数库

1. h 文件
/*
 * libsth.h
 * Declarations for simple error-handling library
//声明简单的错误处理库
 */ 
#ifndef _LIBSTH_H
#define _LIBSTH_H
 
#include "stdarg.h"  //标准参数
//加减乘除函数
/*
 * ADD
 */
int ADD(int a, int b);
 
/*
 * SUBSTRACT
 */
int SUBSTRACT(int a, int b);
 
/*
 * TIMES
 */
int TIMES(int a, int b);
 
/*
 * DIVIDE
 */
float DIVIDE(int a, int b);
#endif
 
2.  c 文件
 
/*
 * libsth.C
 * Implementation of the functions defined in libsth.h //实现h中定义的函数
 */
 
#include "stdarg.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "libsth.h"
 
int ADD(int a, int b)
{
         return a + b;
}
 
int SUBSTRACT(int a, int b)
{
         return a - b;
}
 
int TIMES(int a, int b)
{
         return a * b;
}
 
float DIVIDE(int a, int b)  //未对入口参数进行适当的判断,可能产生错误
{
         return (float)((float)a / (float)b);
}
 
3. 测试库中的函数
/*
 * teststh.C
 * Testing program for libsth library
 */
#include "stdio.h"
#include "stdlib.h"
#include "libsth.h"
#include "iostream.h"
 
int main(void)
{
         int a = ADD(1, 2);
         int b = SUBSTRACT(2, 1);
         int c = TIMES(1, 2);
         float d = DIVIDE(3, 2);
         cout << a << "  " << b << "  " << c << "  " << d << endl;
         //printf("%d  %d  %d  %f\n", a, b, c, d);
         exit(EXIT_SUCCESS); //缺省#define EXIT_SUCCESS 0 ,exit(0)退出程序
}
 
下面是c++版的makefile:
teststh:teststh.o
         g++ teststh.o -static -L. -lsth -L/usr/lib/gcc-lib/i386-redhat-linux/3.2.3 -lstdc++ -o teststh   //不同系统路径有所不同
teststh.o:teststh.C
         g++ -c teststh.C -Wno-deprecated -o teststh.o
libsth.a:libsth.o
         ar rcs libsth.a libsth.o   //生成静态库
libsth.o:libsth.C libsth.h
         g++ -c libsth.C -o libsth.o
all:libsth.a teststh
clean:
         rm -f *.o *.a teststh
 
特别说明:
[root@localhost dss]# gcc -o abc abc.cpp
/tmp/ccY3hmyr.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
[root@localhost dss]# gcc -o abc abc.cpp -lstdc++
有两种讲法:
1. Linux Develop Notes
    * 编译 c++ 程序需要添加 -lstdc++ option. sample: gcc -lstdc++ -o test test
.c,否则会报 "undefined reference to '__gxx_personality_v0' " 错误
2. 唉,用gcc命令编译C程序,用g++命令编译C++程序。
 
本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/qiek/archive/2006/02/09/595400.aspx
 
说明:
1、  -L. -lsth -L/usr/lib/gcc-lib/i386-redhat-linux/3.2.3 -lstdc++显示地使用了两个静态库,即libsth.a和libstdc++.a,因为使用g++ -static编译时它不会自动搜索到这个库,因此必须用 �CL选项显式指定;
2、            -Wno-deprecated是为了屏蔽在用g++ make程序时产生的一些警告信息,这些警告信息认为“iostream.h”中所定义的某些函数是过时的,但是还可以用;
3、 ar rcs libsth.a libsth.o是使用ar命令的rcs选项将libsth.o打包成libsth.a
 
下面是c版的makefile:
teststh:teststh.o
         gcc teststh.o -static -L. -lsth -o teststh
teststh.o:teststh.c libsth.h
         gcc -c teststh.c -o teststh.o
libsth.a:libsth.o
         ar rcs libsth.a libsth.o
libsth.o:libsth.C libsth.h
         g++ -c libsth.C -o libsth.o
all:libsth.a teststh
clean:
         rm -f *.o *.a teststh
 

你可能感兴趣的:(linux,静态,环境,编写,函数库)