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算法所必需的函数和数据结构。它们可能是用C++或其他编程语言编写的,为开发者提供了方便的接口,以便快速集成到自己的...
这个过程大致分为以下几个步骤: 1. **读取Makefile**: make从默认的文件名`Makefile`或`makefile`中读取规则。 2. **解析规则**: make解析文件中的每个规则,识别目标、依赖以及命令。 3. **执行规则**: 根据文件...
附件中文件解压后可直接使用,win7 ,gcc 4.9.2以上编译。 编译过程中libcurl, zlib未作修改 ...注意:这几个库调用是一定要注意顺序,否则link会报错,具体可参照附件中的一个实例,实例采用codeblocks组织。
Makefile通常由以下几个部分组成: 1. **目标**:定义需要构建的文件。 2. **依赖项**:列出目标文件所依赖的文件。 3. **命令**:指定构建目标文件所需的命令。 4. **变量**:用于存储常用路径、选项等信息。 ####...
编译完成后,得到的动态或静态库文件(如`.so`或`.a`)可以链接到Android应用的本地代码中。 使用PJSIP进行VoIP通信时,需要理解以下几个关键概念: 1. **SIP协议**:PJSIP基于Session Initiation Protocol (SIP)...
8. **$(BUILD_STATIC_LIBRARY) / $(BUILD_SHARED_LIBRARY)**: 分别用于构建静态库(.a)和共享库(.so)。 **打包多个SO库** 在Android应用中,可能需要针对不同的CPU架构打包不同的SO库。Android.mk可以通过设置LOCAL_...
与静态库类似,但在运行时需要确保系统中存在相应的共享库文件(`.so`文件)。链接动态库时同样使用`-l<library>`参数。 #### 五、程序的调试 调试是软件开发的重要环节,可以帮助开发者找到并修复程序中的错误。 ...
库程序包括静态库和动态库两种,其中静态库以LIB文件形式存在,链接到可执行文件中;动态库以DLL文件形式存在,被可执行程序或其他DLL调用。 2. 三种应用程序的对比:这是指控制台程序、窗口程序和动态库程序在入口...
1. **Module**:在`Android.mk`文件中,一个module可以是一个静态库(`static library`)、共享库(`shared library`)或其他类型的资源集合。共享库会被打包进应用程序中,而静态库则主要用于创建共享库。 2. **...
在Web服务器中,这部分代码通常涉及以下几个关键部分: 1. **监听套接字**:服务器首先创建一个监听套接字,并绑定到特定的IP地址和端口,然后调用listen函数开始等待客户端连接。 2. **接受连接**:当有新的...
在这个实例详解中,我们将深入探讨如何使用Android.mk来处理不同方面的问题,包括自动添加源文件、依赖第三方库以及构建NDK工程框架。 首先,我们关注如何自动添加需要编译的源文件列表。在示例中,使用了`wildcard...
`libuuid`库通常包含以下几个关键函数: 1. `uuid_generate`: 这个函数用于生成一个新的UUID。它内部实现了RFC 4122标准,确保生成的UUID全局唯一且不重复。调用这个函数会填充一个预分配的`uuid_t`结构体。 2. `...
集成TensorRT到C++项目中通常涉及以下几个步骤: 1. **安装TensorRT**:确保开发环境已经安装了TensorRT库及其依赖项,包括CUDA和cuDNN。 2. **构建环境**:设置CMake或者Makefile来链接TensorRT库,确保编译器能够...
- **lib**:库文件目录,可能包含依赖的静态或动态库。 通过这些文件,我们可以深入了解类 IOCP 接口的具体实现细节,如如何初始化 Epoll 实例、如何管理线程池、如何处理各种网络事件等。同时,测试代码可以帮助...
在这个源码包中,我们可能会找到以下几个关键部分: 1. **tolua源代码**:tolua++的实现主要基于tolua,这是一个用C语言编写的库,负责解析C++头文件并生成Lua绑定代码。这部分源码可能包括tolua的解析器、代码生成...
在将SQLite3移植到开发板的过程中,我们需要了解几个关键知识点: 1. **SQLite3架构理解**:SQLite3的核心是C语言编写的库,它实现了SQL标准并提供了API供应用程序调用。它的设计目标是无服务器、事务性、ACID兼容...
- `l-target`: 由`obj-y`打包生成的静态库文件,通常以`.a`作为后缀。 #### 三、Makefile 配置文件用法 `Makefile`文件是控制源代码编译的关键配置文件。它根据`.config`文件来构造出需要编译的子目录及其源文件...
1. **库文件**:通常包含静态库(.lib)和动态库(.dll),开发者在链接时可以选用合适的方式。 2. **头文件**(.h):包含了库的接口声明,供开发者在源代码中引用。 3. **示例代码**:提供了一些演示如何使用...
7. **编译与链接**:学习如何使用gcc编译器进行预处理、编译、汇编和链接过程,理解-L和-l选项的作用,以及静态库和动态库的区别。 8. **调试技巧**:掌握GDB的使用,包括设置断点、单步执行、查看变量值、跟踪内存...
4. **链接器与库**:学习如何使用静态库和动态库,以及链接器的工作原理,这对于理解和解决链接错误至关重要。 5. **嵌入式Linux内核**:介绍Linux内核的模块化设计,如何编译定制内核,以及驱动程序的开发。 6. *...