`
libaohan
  • 浏览: 45424 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

makefile与静态库的几个实例(转)

阅读更多
makefile与静态库的几个实例



目的 从复杂的工作中简化出来。

网上有一些制作Makfile的文章,只停留在Makefile而已。用autotools的工具相对来说要简单的多,其它一些介绍autotools文章又有很多漏洞,而且步骤烦琐。

制作一个最简单的helloworld程序:

现有目录test

mkdir src 建立src目录存放 源代码
在src下。
编辑hello.c文件


CODE:[Copy to clipboard]#include <stdio.h>

int main()
{
        printf("hello world\n");
        return 0;
}
在src目录下建立Makefile.am文件 (src/Makefile.am)


CODE:[Copy to clipboard]AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello_LDADD = -lpthread (只是测试,实际不需要连接该库)
保存退出

退到test目录

编辑Makefile.am文件 (Makefile.am)

SUBDIRS = src

退出保存

然后
执行
autoscan
生成configure.scan文件

按此编辑此文件


CODE:[Copy to clipboard]#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(hello,1.0, [miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#AC_CONFIG_FILES([Makefile
#                 src/Makefile])
AC_OUTPUT(Makefile src/Makefile)
退出保存
将此文件更名 mv configure.scan configure.in
然后执行
touch NEWS README AUTHORS ChangeLog

然后执行
autoreconf -fvi

至此生成configure文件
执行configure文件

生成Makefile文件

make
make install
make uninstall
make dist
试验一下吧。



/*********************************************************************/
继续完善这个例子,论坛里有人问,如何生成静态库,并连接.

完善hello.c这个例子


当前目录
     |-  src 目录
            |-  hello.c 文件
     |-  include 目录
            |-  hello.h文件
     |-  lib 目录
            |-  test.c文件 此文件用来生成 libhello.a

在当前目录 编写Makefile.am


CODE:[Copy to clipboard]SUBDIRS = lib src
在include目录下 编写hello.h


CODE:[Copy to clipboard]extern void print(char *);
在lib目录下编写test.c


CODE:[Copy to clipboard]#include <stdio.h>

void print(char *msg)
{
        printf("%s\n",msg);
}
在lib目录下编写Makefile.am


CODE:[Copy to clipboard]noinst_LIBRARIES=libhello.a
libhello_a_SOURCES=test.c
这里noinst_LIBRARIES 的意思是生成的静态库 ,不会被make install 安装
然后指定libhello.a的源文件test.c


在src目录下编写hello.c


CODE:[Copy to clipboard]#include "hello.h"

int main()
{
        print("haha");  //这里是静态库里的print函数
        return 0;
}
在src目录下编写Makefile.am


CODE:[Copy to clipboard]INCLUDES= -I../include

bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_LDADD=../lib/libhello.a
首先指定头文件的位置 ../include
然后指定要生成执行文件 hello
然后指定源代码文件 hello.c
最后添加静态库的位置 ../lib/libhello.a


按照我首篇帖子的方式.
执行autoscan 生成configure.scan

修改该文件

按照首篇帖子修改.

然后不同之处
需要添加一行:AC_PROG_RANLIB


CODE:[Copy to clipboard]#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(hello,1.1,[miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC


# Checks for libraries.
AC_PROG_RANLIB
# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#AC_CONFIG_FILES([Makefile
#                lib/Makefile
  #               src/Makefile])
AC_OUTPUT([Makefile
                        lib/Makefile
                        src/Makefile])
mv configure.scan configure.in


touch NEWS README AUTHORS ChangeLog


执行autoreconf -fvi

生成configure.执行configure生成Makefile..


后面同上...


分享到:
评论

相关推荐

    sba实例静态库

    在"集束调整官方代码实例编译中需要的几个静态库"描述中,我们可以推断这些静态库包含了实现SBA算法所必需的函数和数据结构。它们可能是用C++或其他编程语言编写的,为开发者提供了方便的接口,以便快速集成到自己的...

    Linux下makefile实例讲解

    这个过程大致分为以下几个步骤: 1. **读取Makefile**: make从默认的文件名`Makefile`或`makefile`中读取规则。 2. **解析规则**: make解析文件中的每个规则,识别目标、依赖以及命令。 3. **执行规则**: 根据文件...

    libcurl.a(with zlib, openssl , libssh2) 含release静态库和动态库, mingw32编译

    附件中文件解压后可直接使用,win7 ,gcc 4.9.2以上编译。 编译过程中libcurl, zlib未作修改 ...注意:这几个库调用是一定要注意顺序,否则link会报错,具体可参照附件中的一个实例,实例采用codeblocks组织。

    跟我一起写 Makefile

    Makefile通常由以下几个部分组成: 1. **目标**:定义需要构建的文件。 2. **依赖项**:列出目标文件所依赖的文件。 3. **命令**:指定构建目标文件所需的命令。 4. **变量**:用于存储常用路径、选项等信息。 ####...

    PJSIP2.7.2 android 上的实例

    编译完成后,得到的动态或静态库文件(如`.so`或`.a`)可以链接到Android应用的本地代码中。 使用PJSIP进行VoIP通信时,需要理解以下几个关键概念: 1. **SIP协议**:PJSIP基于Session Initiation Protocol (SIP)...

    android ndk编程实例(含注释,如何打包多个so)

    8. **$(BUILD_STATIC_LIBRARY) / $(BUILD_SHARED_LIBRARY)**: 分别用于构建静态库(.a)和共享库(.so)。 **打包多个SO库** 在Android应用中,可能需要针对不同的CPU架构打包不同的SO库。Android.mk可以通过设置LOCAL_...

    linux 操作系统下 c 语言编程入门.pdf

    与静态库类似,但在运行时需要确保系统中存在相应的共享库文件(`.so`文件)。链接动态库时同样使用`-l&lt;library&gt;`参数。 #### 五、程序的调试 调试是软件开发的重要环节,可以帮助开发者找到并修复程序中的错误。 ...

    VC++_Win32 编程入门

    库程序包括静态库和动态库两种,其中静态库以LIB文件形式存在,链接到可执行文件中;动态库以DLL文件形式存在,被可执行程序或其他DLL调用。 2. 三种应用程序的对比:这是指控制台程序、窗口程序和动态库程序在入口...

    Android.mk语法说明(android ndk开发)

    1. **Module**:在`Android.mk`文件中,一个module可以是一个静态库(`static library`)、共享库(`shared library`)或其他类型的资源集合。共享库会被打包进应用程序中,而静态库则主要用于创建共享库。 2. **...

    linux webserver例子

    在Web服务器中,这部分代码通常涉及以下几个关键部分: 1. **监听套接字**:服务器首先创建一个监听套接字,并绑定到特定的IP地址和端口,然后调用listen函数开始等待客户端连接。 2. **接受连接**:当有新的...

    Android开发之Android.mk模板的实例详解

    在这个实例详解中,我们将深入探讨如何使用Android.mk来处理不同方面的问题,包括自动添加源文件、依赖第三方库以及构建NDK工程框架。 首先,我们关注如何自动添加需要编译的源文件列表。在示例中,使用了`wildcard...

    libuuid.zip

    `libuuid`库通常包含以下几个关键函数: 1. `uuid_generate`: 这个函数用于生成一个新的UUID。它内部实现了RFC 4122标准,确保生成的UUID全局唯一且不重复。调用这个函数会填充一个预分配的`uuid_t`结构体。 2. `...

    C++ library based on tensorrt integration.zip

    集成TensorRT到C++项目中通常涉及以下几个步骤: 1. **安装TensorRT**:确保开发环境已经安装了TensorRT库及其依赖项,包括CUDA和cuDNN。 2. **构建环境**:设置CMake或者Makefile来链接TensorRT库,确保编译器能够...

    linux类IOCP接口

    - **lib**:库文件目录,可能包含依赖的静态或动态库。 通过这些文件,我们可以深入了解类 IOCP 接口的具体实现细节,如如何初始化 Epoll 实例、如何管理线程池、如何处理各种网络事件等。同时,测试代码可以帮助...

    tolua_runtime-master_linux_源码.zip

    在这个源码包中,我们可能会找到以下几个关键部分: 1. **tolua源代码**:tolua++的实现主要基于tolua,这是一个用C语言编写的库,负责解析C++头文件并生成Lua绑定代码。这部分源码可能包括tolua的解析器、代码生成...

    sqlite3移植到开发板

    在将SQLite3移植到开发板的过程中,我们需要了解几个关键知识点: 1. **SQLite3架构理解**:SQLite3的核心是C语言编写的库,它实现了SQL标准并提供了API供应用程序调用。它的设计目标是无服务器、事务性、ACID兼容...

    里仁教育嵌入式linux内核编译基础

    - `l-target`: 由`obj-y`打包生成的静态库文件,通常以`.a`作为后缀。 #### 三、Makefile 配置文件用法 `Makefile`文件是控制源代码编译的关键配置文件。它根据`.config`文件来构造出需要编译的子目录及其源文件...

    wxMSW-2.8.12

    1. **库文件**:通常包含静态库(.lib)和动态库(.dll),开发者在链接时可以选用合适的方式。 2. **头文件**(.h):包含了库的接口声明,供开发者在源代码中引用。 3. **示例代码**:提供了一些演示如何使用...

    Linux操作系统下C语言编程入门

    7. **编译与链接**:学习如何使用gcc编译器进行预处理、编译、汇编和链接过程,理解-L和-l选项的作用,以及静态库和动态库的区别。 8. **调试技巧**:掌握GDB的使用,包括设置断点、单步执行、查看变量值、跟踪内存...

    嵌入式Linux应用程序开发标准教程

    4. **链接器与库**:学习如何使用静态库和动态库,以及链接器的工作原理,这对于理解和解决链接错误至关重要。 5. **嵌入式Linux内核**:介绍Linux内核的模块化设计,如何编译定制内核,以及驱动程序的开发。 6. *...

Global site tag (gtag.js) - Google Analytics