Linux搭建自己编译的工程

本文简单介绍单目录工程,多级目录可以参考最后的资料。

一、自己编写Makefile 1

apt-get install make安装make工具。

Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指示, 注释)

  • 显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)
  • 隐晦规则 :: make的自动推导功能所执行的规则
  • 变量定义 :: Makefile中定义的变量
  • 文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令
  • 注释 :: Makefile只有行注释 “#”, 如果要使用或者输出"#"字符, 需要进行转义, “#”

规则语法

规则主要有2部分: 依赖关系 和 生成目标的方法 :

target ... : prerequisites ...
    command
    ...

或者

target ... : prerequisites ; command
    command
    ...

其中

  • target - 目标文件, 可以是 Object File, 也可以是可执行文件
  • prerequisites - 生成 target 所需要的文件或者目标
  • command - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头

比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。

a.txt: b.txt c.txt
    cat 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。

  1. flat指的是所有文件都位于同一个目录中。

就是所有源文件、头文件以及其他库文件都位于当前目录中,且没有子目录。Termutils就是这一类。

  1. shallow指的是主要的源代码都储存在顶层目录,其他各个部分则储存在子目录中。

就是主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。automake本身就是这一类。

  1. deep指的是所有源代码都被储存在子目录中;顶层目录主要包含配置信息。

就是所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件。 GNU cpio和GNU tar就是这一类。

flat类型是最简单的,deep类型是最复杂的。不难看出,我们的模拟需求正是基于第三类deep型,也就是说我们要做挑战性的事情:)。注:我们的测试程序是基于多线程的简单程序。

生成 Makefile 的来龙去脉

产生Makefile的流程如图所示(老版本遗留):
在这里插入图片描述

实际操作演练

  1. 使用 autoscan 生成configure.scan
    在这里插入图片描述

我们可以打开configure.scan,可以发现每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局:

在这里插入图片描述在这里插入图片描述

  1. 执行autoscan ./,将生成的configure.scan重新命名为configure.ac,编辑文件。
  2. 创建并编辑 Makefile.am 文件 。相关代码: 点击跳转
  3. 执行下面命令
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 并编译的流程如下:

  1. 安装cmake,并编写 CmakeLists.txt。
  2. 执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt 所在的目录 )。
  3. 使用 make 命令进行编译。

相关代码: 点击跳转

将其他平台的项目迁移到 CMake

CMake 可以很轻松地构建出在适合各个平台执行的工程环境。而如果当前的工程环境不是 CMake ,而是基于某个特定的平台,是否可以迁移到 CMake 呢?答案是可能的。下面针对几个常用的平台,列出了它们对应的迁移方案。

autotools

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.o
	g++ -o hello hello.o
hello.o : hello.cpp hello.h
	g++ -c hello.cpp
clean : cleanobj	
	rm hello
cleanobj :
	rm *.o
.PHONY: hello clean	

换个方式:

cc=g++
CFLAGS=-std=c++11
DEPS=hello.h
OBJ=hello.o

hello : $(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 : cleanobj
        rm 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)



参考文献:

引用:

  1. 阮一峰 - Make命令教程 ↩︎

  2. IBM - 杨小华 - 例解 autoconf 和 automake 生成 Makefile 文件 ↩︎

  3. IBM - 王程明 - 在 linux 下使用 CMake 构建应用程序 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值