文件如下:

root@ubuntu:/home/test# ll
total
drwxr-xr-x root root Sep : ./
drwxr-xr-x root root Sep : ../
-rwxr-xr-x root root Sep : a.out*
-rwxr-xr-x root root Sep : exe*
drwxr-xr-x root root Sep : lib/
-rwxrwxrwx root root Sep : libcaller.cpp*
-rw-r--r-- root root Sep : libcaller.h
-rw-r--r-- root root Sep : libcaller.o
-rwxrwxrwx root root Sep : libfuncapi.cpp*
-rw-r--r-- root root Sep : libfuncapi.h
-rw-r--r-- root root Sep : libfuncapi.o
-rw-r--r-- root root Sep : libsystemapi.h
-rwxrwxrwx root root Sep : libsystem.cpp*
-rw-r--r-- root root Sep : libsystem.o
-rw-r--r-- root root Sep : makefile
-rwxrwxrwx root root Sep : test.cpp*
root@ubuntu:/home/test#

文件内容分别如下:

root@ubuntu:/home/test# cat test.cpp
#include <iostream> extern void caller(); int main()
{
caller();
return ;
} root@ubuntu:/home/test# cat libcaller.h
#ifndef LIB_CALLER_H
#define LIB_CALLER_H void caller(); #endif
root@ubuntu:/home/test# cat libcaller.cpp
#include <stdio.h>
#include "libfuncapi.h" void caller()
{
printf("this is %s @ %s:%d.", __FUNCTION__,__FILE__,__LINE__);
func_api();
return;
} root@ubuntu:/home/test# cat libfuncapi.h
#ifndef FUNC_API_H
#define FUNC_API_H void func_api(); #endif
root@ubuntu:/home/test# cat libfuncapi.cpp
#include <stdio.h>
#include "libsystemapi.h"
#include "libfuncapi.h" void func_api()
{
printf("this is %s @ %s:%d.\n", __FUNCTION__,__FILE__,__LINE__);
system_api();
return;
} #if 0
int main()
{
funcapi();
return ;
}
#endif
root@ubuntu:/home/test# cat libsystemapi.h
#ifndef SYSTEM_API_H
#define SYSTEM_API_H void system_api(); #endif
root@ubuntu:/home/test# cat libsystem.cpp
#include <stdio.h> void system_api()
{
printf("this is %s @ %s:%d.", __FUNCTION__,__FILE__,__LINE__);
return;
} root@ubuntu:/home/test#

makefile:

root@ubuntu:/home/test#
root@ubuntu:/home/test# cat makefile CUR_DIR=$(PWD) RM = rm -f OBJS = $(CUR_DIR)/*.o
LIB_DIR = $(CUR_DIR)/lib all: pre_work libsystemapi.a libfuncapi.a libcaller.a test libsystemapi.a:
g++ -c libsystem.cpp -o libsystem.o
ar cr $@ libsystem.o libfuncapi.a:libsystem.o
g++ -c libfuncapi.cpp -o libfuncapi.o
ar cr $@ libfuncapi.o $^ libcaller.a:libfuncapi.o libsystem.o
g++ -c libcaller.cpp -o libcaller.o
ar cr $@ libcaller.o $^ test: post_work $(LIB_DIR)/libcaller.a
g++ test.cpp $(LIB_DIR)/libcaller.a -o exe pre_work:
mkdir -p $(LIB_DIR) post_work:
mv ./*.a $(LIB_DIR)/ clean:
$(RM) $(OBJS) $(LIB_DIR)/*
root@ubuntu:/home/test#

【linux】 静态库编译的更多相关文章

  1. linux静态库的生成与使用(转)

    linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...

  2. Linux静态库生成指南

    Linux静态库生成指南   Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生 ...

  3. linux动态库编译和使用详细剖析

    引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, 预编译,编译,生成机械码最后链接输 ...

  4. linux动态库编译和使用

    linux动态库编译和使用详细剖析 引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, ...

  5. QT 4.8 静态库编译方法

    最最初踏上QT之路是受到了XiaomaGee的指点,相比于常规的窗口程序开发,QT有着以下特点: 1. 优良的跨平台特性(支持Win.Linux.Mac 不同的平台下只需重新编译即可使用) 2. 面向 ...

  6. linux动态库编译和使用详细剖析 - 后续

    引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...

  7. [转]QT 4.8 静态库编译方法

    最最初踏上QT之路是受到了XiaomaGee的指点,相比于常规的窗口程序开发,QT有着以下特点: 1. 优良的跨平台特性(支持Win.Linux.Mac 不同的平台下只需重新编译即可使用) 2. 面向 ...

  8. Linux 静态库(.a)转换为动态库(.so)

    Linux 静态库转换为动态库 参考 http://blog.csdn.net/moxuansheng/article/details/5812410 首先将.a文件转为.so文件是可以实现的 原因是 ...

  9. 关于Linux静态库和动态库的分析

    关于Linux静态库和动态库的分析 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可运行代码的二进制形式.能够被操作系统加 ...

  10. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

随机推荐

  1. NeHe OpenGL教程 第十七课:2D图像文字

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. java学习日志(1):命令行and小程序

    1.dos命令行,常见的命令 dir:列出当前目录下的文件以及文件夹md:创建目录rd:删除目录(必须空)cd:进入指定目录cd.. :退回到上一级目录cd/:退回到根目录del:删除文件exit:退 ...

  3. HTML5 Web Storage概述

    Web Storage html5新增功能 可以在客户端本地保存数据 之前是使用Cookies在客户端保存注入用户名等简单用户信息,但永久数据存在几个问题 大小:cookies大小被限制在4KB 带宽 ...

  4. 火狐firefox提示“内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。”

    火狐firefox浏览器打开网也是时提示“内容编码错误 无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式.” 今早一来打开用PHPCMS做的网站时就提示这个错误,用其他浏览器打开提示的是 ...

  5. EF下CodeFirst、DBFirst与ModelFirst分析

    EF4.1有三种方式来进行数据操作及持久化.分别是Database-First,Model-First,Code-first:1.Database First是基于已存在的数据库,利用某些工具(如Vs ...

  6. [SQL]insert、update 表触发器应用的demo

    --创建测试表 create table student ( stu_id int ,libraryCardNo varchar() ) create table borrowbook ( b_id ...

  7. HttpRequestValidationException (0x80004005) 的三种可能的解决方法

    从客户端中检测到有潜在危险的 Request.Form 值 从客户端(txtSupplement="<textarea name="cont...")中检测到有潜在 ...

  8. 扩大View的点击范围

    扩大View的点击范围本人知道的有两种方法,在不影响界面效果的前提下: 1.在View的外面添加一个透明容器 2.就是本文要说的,代码如下 : public void addToParentArea( ...

  9. 为textarea增加maxlength属性(转)

    如果只是單純地想限制 textarea 中的字數,不想寫太多的話,可用:   <textarea onkeyup="this.value = this.value.slice(0, 8 ...

  10. MFC学习 消息钩子使用

    HANDLE h_KeyBoard; //当前进程的钩子, 另外WH_KEYBOARD_LL, 与WH_MOUSE_LL参数时, 是获取的底层的消息, 相当于获取的全局的 g_hKeyBoard = ...