工程"/>
Linux搭建自己编译的工程
本文简单介绍单目录工程,多级目录可以参考最后的资料。
一、自己编写Makefile 1
apt-get install make
安装make
工具。
Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指示, 注释)
- 显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)
- 隐晦规则 :: make的自动推导功能所执行的规则
- 变量定义 :: Makefile中定义的变量
- 文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令
- 注释 :: Makefile只有行注释 “#”, 如果要使用或者输出"#"字符, 需要进行转义, “#”
规则语法
规则主要有2部分: 依赖关系 和 生成目标的方法 :
target ... : prerequisites ..mand...
或者
target ... : prerequisites ; commandcommand...
其中
- target - 目标文件, 可以是 Object File, 也可以是可执行文件
- prerequisites - 生成 target 所需要的文件或者目标
- command - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头
比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。
a.txt: b.txt c.txtcat b.txt c.txt > a.txt
像这样的规则,都写在一个叫做Makefile的文件中,Make命令依赖这个文件进行构建。Makefile文件也可以写为makefile, 或者用命令行参数指定为其他文件名。
$ make -f rules.txt
或者
$ make --file=rules.txt
我的小实验: 点击跳转
二、利用 autoconf 和 automake 2
安装所必须的软件:apt-get inatsll autoconf/automake/m4/perl/libtool(其中libtool非必须)。
autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到 m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。
目前automake支持三种目录层次:flat、shallow和deep。
- flat指的是所有文件都位于同一个目录中。
就是所有源文件、头文件以及其他库文件都位于当前目录中,且没有子目录。Termutils就是这一类。
- shallow指的是主要的源代码都储存在顶层目录,其他各个部分则储存在子目录中。
就是主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。automake本身就是这一类。
- deep指的是所有源代码都被储存在子目录中;顶层目录主要包含配置信息。
就是所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件。 GNU cpio和GNU tar就是这一类。
flat类型是最简单的,deep类型是最复杂的。不难看出,我们的模拟需求正是基于第三类deep型,也就是说我们要做挑战性的事情:)。注:我们的测试程序是基于多线程的简单程序。
生成 Makefile 的来龙去脉
产生Makefile的流程如图所示(老版本遗留):
实际操作演练
- 使用 autoscan 生成configure.scan
我们可以打开configure.scan,可以发现每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局:
- 执行
autoscan ./
,将生成的configure.scan
重新命名为configure.ac
,编辑文件。 - 创建并编辑 Makefile.am 文件 。相关代码: 点击跳转
- 执行下面命令
1. aclocal
2. autoconf
3. autoheader
4. automake --add-missing
5. ./configure
6. make
三、利用Cmake3
CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。
文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 AutoConfig 更简洁的语法。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
- 安装cmake,并编写 CmakeLists.txt。
- 执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt 所在的目录 )。
- 使用 make 命令进行编译。
相关代码: 点击跳转
将其他平台的项目迁移到 CMake
CMake 可以很轻松地构建出在适合各个平台执行的工程环境。而如果当前的工程环境不是 CMake ,而是基于某个特定的平台,是否可以迁移到 CMake 呢?答案是可能的。下面针对几个常用的平台,列出了它们对应的迁移方案。
autotools
- am2cmake 可以将 autotools 系的项目转换到 CMake,这个工具的一个成功案例是 KDE 。
- Alternative Automake2CMake 可以转换使用 automake 的 KDevelop 工程项目。
- Converting autoconf tests
qmake
- qmake converter 可以转换使用 QT 的 qmake 的工程。
Visual Studio
- vcproj2cmake.rb 可以根据 Visual Studio 的工程文件(后缀名是 .vcproj 或 .vcxproj)生成 CMakeLists.txt 文件。
- vcproj2cmake.ps1 vcproj2cmake 的 PowerShell 版本。
- folders4cmake 根据 Visual Studio 项目文件生成相应的 “source_group” 信息,这些信息可以很方便的在 CMake 脚本中使用。支持 Visual Studio 9/10 工程文件。
CMakeLists.txt 自动推导
- gencmake 根据现有文件推导 CMakeLists.txt 文件。
- CMakeListGenerator 应用一套文件和目录分析创建出完整的 CMakeLists.txt 文件。仅支持 Win32 平台。
实验代码 - 已上传
1. makefile实验代码:
hello : hello.og++ -o hello hello.o
hello.o : hello.cpp hello.hg++ -c hello.cpp
clean : cleanobj rm hello
cleanobj :rm *.o
.PHONY: hello clean
换个方式:
cc=g++
CFLAGS=-std=c++11
DEPS=hello.h
OBJ=hello.ohello : $(OBJ)echo "output hello"$(cc) -o $@ $^ $(CFLAGS)
#$@指代当前目标,就是Make命令当前构建的那个目标。比如,make hello 的 $@ 就指代hello
#$^ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2%.o : %.cpp $(DEPS)echo "output %.o"$(cc) -c $<
# $< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1。# clean the object
clean : cleanobjrm hello
2. automake实验代码:
configure.ac
文件:
# let`s check for a C++ compiler
AC_LANG(C++)# Checks for programs.
AC_PROG_CXX
AC_PROG_CC# Let`s specify where the Makefiles should be produce.
AC_CONFIG_FILES([Makefile])
AC_CONFIG_SRCDIR([hello.cpp])
AC_CONFIG_HEADERS([config.h])# Checks for libraries.# Check if the header file exists in the installation repository,
# like string.h , sys/time.h or ...
AC_CHECK_HEADERS([sys/time.h])# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT
Makefile.am
文件:
# We dont`t follow GNU file setup
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.cpp
3. Cmake实验代码:
CMakeLists.txt 文件:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.10)# 项目信息
project (hello)# 指定生成目标
add_executable(hello hello.cpp)
参考文献:
- 知乎 - JustSong - 一个简单的 make & makefile 教程
- cnblogs - id被吃了 - Configure文件学习
- Youtube - b yuksel - Automake C++ Tutorial
- HaHack - CMake 入门实战
引用:
阮一峰 - Make命令教程 ↩︎
IBM - 杨小华 - 例解 autoconf 和 automake 生成 Makefile 文件 ↩︎
IBM - 王程明 - 在 linux 下使用 CMake 构建应用程序 ↩︎
更多推荐
Linux搭建自己编译的工程
发布评论