制作Makefile

本文详细介绍了使用自动化构建工具配置项目的步骤,包括从创建configure.in文件到最终生成Makefile的过程。涉及的关键步骤有:使用autoscan生成configure.scan,通过aclocal生成aclocal.m4文件,运用autoconf生成configure脚本等。

1、进入代码目录 运行autoscan

 

     在当前目录下会生成configure.scan文件

     重命名configure.scan为configure.in

     并按如下修改


     AC_PREREQ([2.65])

     AC_INIT([vpn], [0.1], [ligao@comodo.com])

     AM_INIT_AUTOMAKE(easyvpn, 0.1)  

 

     AC_CONFIG_SRCDIR([vpn.cpp])

     AC_CONFIG_HEADERS([config.h])

 

     # Checks for programs.

     AC_PROG_CXX

     AC_PROG_CC

 

     # Checks for libraries.

 

     # Checks for header files.

     AC_CHECK_HEADERS([arpa/inet.h fcntl.h memory.h netdb.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h unistd.h wchar.h])

 

    # Checks for typedefs, structures, and compiler characteristics.

    AC_HEADER_STDBOOL

    AC_C_INLINE

    AC_TYPE_INT32_T

    AC_TYPE_SIZE_T

 

    # Checks for library functions.

    AC_FUNC_ERROR_AT_LINE

    AC_FUNC_MALLOC

    AC_CHECK_FUNCS([alarm inet_ntoa memmove memset select socket strchr strstr strtol])

 

    AC_OUTPUT([Makefile])

 

2,运行 aclocal

   生成aclocal.m4文件及autom4te.cache目录

 

3,运行autoconf

   生成configure文件


4,运行autoheader生成config.h.in文件

 

5,手工生成Makefile.am文件

   AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare /

              -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef /

              -Wcast-qual -Wno-long-long -DGLOOX_IMPORTS

   AUTOMAKE_OPTIONS = foreign

   noinst_PROGRAMS = easyvpn

   easyvpn_SOURCES = vpn.cpp crypto_aes.cpp ConvertUTF.c NetWorksManager.cpp VpnTunnel.cpp

   easyvpn_LDADD = 

   easyvpn_LDFLAGS = -pthread -lresolv -lresolv  -lssl -lcrypto -lz -ldl -lgloox

   easyvpn_CFLAGS = $(CPPFLAGS)

 

6,运行automake --add-missing

   生成Makefile.in

 

7,运行./configure

   生成Makefile

### Linux 下创建 Makefile 遇到的常见错误及解决方案 当在 Linux 环境下编写 `Makefile` 并运行 `make` 命令时,可能会遇到各种类型的错误。以下是几种常见的报错情况及其对应的解决方法。 #### 编译器找不到特定结构体成员变量 如果收到类似于 “‘struct redisServer’ 没有名为 ‘lua_always_replicate_commands’ 的成员”的错误消息[^2] 或者 “‘struct redisServer’ 没有名为 ‘assert_line’ 的成员” 这样的提示[^4] ,这通常意味着源代码中的某些部分试图访问不存在于该版本的数据结构内的字段。这类问题往往发生在库更新之后,旧版程序尝试使用新版 API 中已移除或重命名的功能。 为了修正这个问题: - 查看当前使用的 Redis 版本以及其官方文档来确认数据结构定义; - 更新项目依赖项至兼容版本; - 修改本地代码以匹配最新发布的接口规格; ```c // 示例:检查并调整 struct 定义 if (redis_version >= REDIS_6_0) { // 使用新方式获取配置参数 } else { // 向后兼容处理逻辑 } ``` #### 头文件冲突或缺失内联函数声明 对于像 `/usr/lib/gcc/i686-linux-gnu/5/include/emmintrin.h:1180:1:` 所指出的位置发生的编译失败[^3] ,可能是由于不同版本之间头文件不一致引起的问题或者是缺少必要的预处理器宏定义造成的。 建议采取以下措施: - 清理工作区重新安装开发工具链及相关包件; - 显式指定所需的标准扩展集(如 `-msse2`),确保所有机器上的一致性; - 如果可能的话升级整个系统的 GCC 到较新的稳定发行版; ```bash sudo apt-get update && sudo apt-get install build-essential gcc -march=native test_program.c -o test_program ``` #### 正确构建 Makefile 文件 最后,在编写 `Makefile` 本身的过程中也容易犯一些基础性的语法失误。例如忘记设置目标对象名称就直接调用了 `make objname` 。正确的做法是在相应的目录下调用简单的 `make` 来触发默认规则,或者明确指明要构建的目标[^1] : ```makefile # Makefile 示例片段 CC=gcc CFLAGS=-Wall -g TARGET=program_name all: $(TARGET) $(TARGET): main.o utils.o $(CC) $^ -o $@ clean: rm -f *.o $(TARGET) ``` 通过以上几个方面的排查可以有效减少大部分与 Makefile 和 C/C++ 编程有关的编译期异常状况的发生频率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值