您的位置:首页 > 编程语言 > C语言/C++

交叉编译多个cpp或者c文件自动构建Makefile

2016-05-02 22:39 543 查看
正好今天要使用automake来生成makefile,在此做个记录。

目前在同一个文件夹下有如下几个c++文件



下面一步一步的生成makefile文件

首先执行 :

ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ autoscan


执行该命令后,会根据我的源码生成configure.scan文件,然后修改或者拷贝成configure.ac文件,大致过程如下:

your source files –> [autoscan*] –> [configure.scan] –> configure.ac

这里该需要对configure.ac做一下修改:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT(acontiethercat, [1.0], [])
AM_INIT_AUTOMAKE(acontiethercat,1.0)
AC_CONFIG_SRCDIR([SyncSmDemoMain.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX(arm-linux-gnueabihf-g++)
AC_PROG_CC(arm-linux-gnueabihf-gcc)

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_CHECK_FUNCS([clock_gettime uname])

AC_OUTPUT(Makefile)


其中要改正的部分有:

AC_INIT(acontiethercat, [1.0], [])

其格式为:AC_INIT(package, version, bug-report-address)

这个第一个参数是要生成的bin文件的名字,第二个参数版本号,第二个参数写邮箱或者反馈bug的连接。

AM_INIT_AUTOMAKE(acontiethercat,1.0)

新加入的一个宏,为automake提供设置可移植性参数的一个宏,参数取上面的宏的前两项。

AC_CONFIG_SRCDIR([SyncSmDemoMain.cpp])

这只main函数所在的源码文件。

AC_PROG_CXX(arm-linux-gnueabihf-g++)

AC_PROG_CC(arm-linux-gnueabihf-gcc)

这里设置交叉编译器。

注意这个*.ac的格式,括号与宏之间不能用空格,例如:

AC_INIT ([oops], [1.0]) # incorrect

AC_INIT([hello], [1.0]) # good

AC_OUTPUT(Makefile)

每一个*.ac比如configure.ac文件都要以这个宏结束。

有了这个宏才会生成config.status并且运行它。我们这里吧输出文件设置Makefile ,该宏的设置格式为:

AC_OUTPUT ([file]. . . , [extra-cmds], [init-cmds])


这个宏是替换之前的废弃的老的格式:

AC_CONFIG_FILES(file...)
AC_CONFIG_COMMANDS([default],extra-cmds, init-cmds)
AC_OUTPUT


接下来执行aclocal 来生成aclocal.m4文件。执行autoconf生成configure文件。执行autoheader ,生成config.h.in ,config.h文件。

ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ aclocal
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ autoconf
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ autoheader


完毕后,就要手动建立一个Makefile.am文件设置一些参数等等,下面我写的一个makefile.am

AM_LDFLAGS = -lpthread -lc -lm -lrt -ldl  -lemllCPSW -lemllDW3504 \
-lemllFslFec -lemllGEM -lemllSockRaw
CXXFLAGS = -D__STDC_LIMIT_MACROS -g -Wall -DORDER_SERIALIZE \
-L /home/ubuntu/work/bbb/armv6-vfp-eabihf -I /home/ubuntu/work/bbb/INC \
-I/home/ubuntu/work/bbb/INC/Linux

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=acontisethercat
acontisethercat_SOURCES= ecatDemoCommon.cpp  \
Logging.cpp      \
SyncSmDemo.cpp   \
ecatNotification.cpp \
selectLinkLayer.cpp \
SyncSmDemoMain.cpp  \
EcTimer.cpp
~
~


AM_LDFLAGS CXXFLAGS

是设置一些参数的,因人而异。

bin_PROGRAMS=acontisethercat

是设置做成二进制的文件名字

acontisethercat_SOURCES

这是设置是二进制的所以依赖的cpp文件。acontisethercat_SOURCES这个宏的前面的名字与生成二进制的名字向对应。

而下来就可以执行 automake –add-missing

ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ automake --add-missing


接下来要进行配置,假如交叉编译,配置的时候要加上host参数

ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ ./configure  --host=arm-linux-gnueabihf


一切完毕,就可以进行make了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息