在linux下写程序,免不了要写Makefile文件,用automake,总感觉比较麻烦,linux人喜欢做麻烦的事,以显得风格迥异。

其实用qmake生成Makefile文件相当简单。

1 装好qmake工具

2 在源码工程目录下,运行qmake -project

这样会生成一个*.pro文件。

3 运行qmake -makefile *.pro,生成Makefile文件。

此Makefile文件,包含很多的qt的信息,如果工程中没有用到qt相关的库,那么可以删去。

例子:

一个工程目录下:

有三个目录,a,b,m。其中a目录下有a.c和a.h,b目录下b.c和b.h,m目录下main.c

a.c内容:

#include <stdio.h>

#include "a.h"



int a(void)

{

    printf("call a!\n");

    return 0;

}

a.h内容:

#ifndef __A_H

#define __A_H

int a(void);

#endif

-------------------

b.c内容:

#include <stdio.h>

#include "b.h"



int b(void)

{

    printf("call b!\n");

    return 0;

}

b.h内容:

#ifndef __B_H

#define __B_H

int b(void);

#endif

--------------------

main.c内容:

#include <stdio.h>

#include "a.h"

#include "b.h"

int main(int argc, char** argv)

{

    if(argc > 1)

    {

        printf("%s\n", argv[1]);

    }

    printf("Hello, Linux World!\n");

    a();

    b();    

    return 0;

}

-------------------

生成的.pro文件

######################################################################

# Automatically generated by qmake (2.01a) Thu Mar 7 09:38:10 2013

######################################################################



TEMPLATE = app

TARGET =

DEPENDPATH += . a b m

INCLUDEPATH += . a b



# Input

HEADERS += a/a.h b/b.h

SOURCES += a/a.c b/b.c m/main.c

-----------------------------

生成的Makefile文件

#############################################################################

# Makefile for building: test3

# Generated by qmake (2.01a) (Qt 4.6.2) on: Thu Mar 7 10:01:40 2013

# Project:  test3.pro

# Template: app

# Command: /usr/bin/qmake -unix -o Makefile test3.pro

#############################################################################



####### Compiler, tools and options



CC            = gcc

CXX           = g++

DEFINES       = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB

CFLAGS        = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

CXXFLAGS      = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

INCPATH       = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -Ia -Ib -I.

LINK          = g++

LFLAGS        = -Wl,-O1

LIBS          = $(SUBLIBS)  -L/usr/lib -lQtGui -lQtCore -lpthread

AR            = ar cqs

RANLIB        =

QMAKE         = /usr/bin/qmake

TAR           = tar -cf

COMPRESS      = gzip -9f

COPY          = cp -f

SED           = sed

COPY_FILE     = $(COPY)

COPY_DIR      = $(COPY) -r

STRIP         = strip

INSTALL_FILE  = install -m 644 -p

INSTALL_DIR   = $(COPY_DIR)

INSTALL_PROGRAM = install -m 755 -p

DEL_FILE      = rm -f

SYMLINK       = ln -f -s

DEL_DIR       = rmdir

MOVE          = mv -f

CHK_DIR_EXISTS= test -d

MKDIR         = mkdir -p



####### Output directory



OBJECTS_DIR   = ./



####### Files



SOURCES       = a/a.c \

        b/b.c \

        m/main.c

OBJECTS       = a.o \

        b.o \

        main.o

DIST          = /usr/share/qt4/mkspecs/common/g++.conf \

        /usr/share/qt4/mkspecs/common/unix.conf \

        /usr/share/qt4/mkspecs/common/linux.conf \

        /usr/share/qt4/mkspecs/qconfig.pri \

        /usr/share/qt4/mkspecs/features/qt_functions.prf \

        /usr/share/qt4/mkspecs/features/qt_config.prf \

        /usr/share/qt4/mkspecs/features/exclusive_builds.prf \

        /usr/share/qt4/mkspecs/features/default_pre.prf \

        /usr/share/qt4/mkspecs/features/release.prf \

        /usr/share/qt4/mkspecs/features/default_post.prf \

        /usr/share/qt4/mkspecs/features/warn_on.prf \

        /usr/share/qt4/mkspecs/features/qt.prf \

        /usr/share/qt4/mkspecs/features/unix/thread.prf \

        /usr/share/qt4/mkspecs/features/moc.prf \

        /usr/share/qt4/mkspecs/features/resources.prf \

        /usr/share/qt4/mkspecs/features/uic.prf \

        /usr/share/qt4/mkspecs/features/yacc.prf \

        /usr/share/qt4/mkspecs/features/lex.prf \

        /usr/share/qt4/mkspecs/features/include_source_dir.prf \

        test3.pro

QMAKE_TARGET  = test3

DESTDIR       =

TARGET        = test3



first: all

####### Implicit rules



.SUFFIXES: .o .c .cpp .cc .cxx .C



.cpp.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.cc.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.cxx.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.C.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.c.o:

    $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"



####### Build rules



all: Makefile $(TARGET)



$(TARGET):  $(OBJECTS)  

    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)



Makefile: test3.pro  /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/share/qt4/mkspecs/common/g++.conf \

        /usr/share/qt4/mkspecs/common/unix.conf \

        /usr/share/qt4/mkspecs/common/linux.conf \

        /usr/share/qt4/mkspecs/qconfig.pri \

        /usr/share/qt4/mkspecs/features/qt_functions.prf \

        /usr/share/qt4/mkspecs/features/qt_config.prf \

        /usr/share/qt4/mkspecs/features/exclusive_builds.prf \

        /usr/share/qt4/mkspecs/features/default_pre.prf \

        /usr/share/qt4/mkspecs/features/release.prf \

        /usr/share/qt4/mkspecs/features/default_post.prf \

        /usr/share/qt4/mkspecs/features/warn_on.prf \

        /usr/share/qt4/mkspecs/features/qt.prf \

        /usr/share/qt4/mkspecs/features/unix/thread.prf \

        /usr/share/qt4/mkspecs/features/moc.prf \

        /usr/share/qt4/mkspecs/features/resources.prf \

        /usr/share/qt4/mkspecs/features/uic.prf \

        /usr/share/qt4/mkspecs/features/yacc.prf \

        /usr/share/qt4/mkspecs/features/lex.prf \

        /usr/share/qt4/mkspecs/features/include_source_dir.prf

    $(QMAKE) -unix -o Makefile test3.pro

/usr/share/qt4/mkspecs/common/g++.conf:

/usr/share/qt4/mkspecs/common/unix.conf:

/usr/share/qt4/mkspecs/common/linux.conf:

/usr/share/qt4/mkspecs/qconfig.pri:

/usr/share/qt4/mkspecs/features/qt_functions.prf:

/usr/share/qt4/mkspecs/features/qt_config.prf:

/usr/share/qt4/mkspecs/features/exclusive_builds.prf:

/usr/share/qt4/mkspecs/features/default_pre.prf:

/usr/share/qt4/mkspecs/features/release.prf:

/usr/share/qt4/mkspecs/features/default_post.prf:

/usr/share/qt4/mkspecs/features/warn_on.prf:

/usr/share/qt4/mkspecs/features/qt.prf:

/usr/share/qt4/mkspecs/features/unix/thread.prf:

/usr/share/qt4/mkspecs/features/moc.prf:

/usr/share/qt4/mkspecs/features/resources.prf:

/usr/share/qt4/mkspecs/features/uic.prf:

/usr/share/qt4/mkspecs/features/yacc.prf:

/usr/share/qt4/mkspecs/features/lex.prf:

/usr/share/qt4/mkspecs/features/include_source_dir.prf:

qmake:  FORCE

    @$(QMAKE) -unix -o Makefile test3.pro



dist:

    @$(CHK_DIR_EXISTS) .tmp/test31.0.0 || $(MKDIR) .tmp/test31.0.0

    $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/test31.0.0/ && $(COPY_FILE) --parents a/a.h b/b.h .tmp/test31.0.0/ && $(COPY_FILE) --parents a/a.c b/b.c m/main.c .tmp/test31.0.0/ && (cd `dirname .tmp/test31.0.0` && $(TAR) test31.0.0.tar test31.0.0 && $(COMPRESS)
test31.0.0.tar) && $(MOVE) `dirname .tmp/test31.0.0`/test31.0.0.tar.gz . && $(DEL_FILE) -r .tmp/test31.0.0





clean:compiler_clean

    -$(DEL_FILE) $(OBJECTS)

    -$(DEL_FILE) *~ core *.core





####### Sub-libraries



distclean: clean

    -$(DEL_FILE) $(TARGET)

    -$(DEL_FILE) Makefile





mocclean: compiler_moc_header_clean compiler_moc_source_clean



mocables: compiler_moc_header_make_all compiler_moc_source_make_all



compiler_moc_header_make_all:

compiler_moc_header_clean:

compiler_rcc_make_all:

compiler_rcc_clean:

compiler_image_collection_make_all: qmake_image_collection.cpp

compiler_image_collection_clean:

    -$(DEL_FILE) qmake_image_collection.cpp

compiler_moc_source_make_all:

compiler_moc_source_clean:

compiler_uic_make_all:

compiler_uic_clean:

compiler_yacc_decl_make_all:

compiler_yacc_decl_clean:

compiler_yacc_impl_make_all:

compiler_yacc_impl_clean:

compiler_lex_make_all:

compiler_lex_clean:

compiler_clean:



####### Compile



a.o: a/a.c a/a.h

    $(CC) -c $(CFLAGS) $(INCPATH) -o a.o a/a.c



b.o: b/b.c b/b.h

    $(CC) -c $(CFLAGS) $(INCPATH) -o b.o b/b.c



main.o: m/main.c a/a.h \

        b/b.h

    $(CC) -c $(CFLAGS) $(INCPATH) -o main.o m/main.c



####### Install



install:   FORCE



uninstall:   FORCE



FORCE:

其中Makefile中的红色部分可以删除,最后的Makefile文件如下:

#############################################################################

# Makefile for building: test3

# Generated by qmake (2.01a) (Qt 4.6.2) on: Thu Mar 7 09:38:41 2013

# Project:  test3.pro

# Template: app

# Command: /usr/bin/qmake -unix -o Makefile test3.pro

#############################################################################



####### Compiler, tools and options



CC            = gcc

CXX           = g++



CFLAGS        = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

CXXFLAGS      = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

INCPATH       = -I. -Ia -Ib -I.

LINK          = g++

LFLAGS        = -Wl,-O1

LIBS          = $(SUBLIBS)  -L/usr/lib -lpthread

AR            = ar cqs

RANLIB        =

QMAKE         = /usr/bin/qmake

TAR           = tar -cf

COMPRESS      = gzip -9f

COPY          = cp -f

SED           = sed

COPY_FILE     = $(COPY)

COPY_DIR      = $(COPY) -r

STRIP         = strip

INSTALL_FILE  = install -m 644 -p

INSTALL_DIR   = $(COPY_DIR)

INSTALL_PROGRAM = install -m 755 -p

DEL_FILE      = rm -f

SYMLINK       = ln -f -s

DEL_DIR       = rmdir

MOVE          = mv -f

CHK_DIR_EXISTS= test -d

MKDIR         = mkdir -p



####### Output directory



OBJECTS_DIR   = ./



####### Files



SOURCES       = a/a.c \

        b/b.c \

        m/main.c

OBJECTS       = a.o \

        b.o \

        main.o

QMAKE_TARGET  = test3

DESTDIR       =

TARGET        = test3



first: all

####### Implicit rules



.SUFFIXES: .o .c .cpp .cc .cxx .C



.cpp.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.cc.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.cxx.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.C.o:

    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"



.c.o:

    $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"



####### Build rules



all: $(TARGET)



$(TARGET):  $(OBJECTS)  

    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)



clean:

    -$(DEL_FILE) $(OBJECTS)

    -$(DEL_FILE) *~ core *.core





####### Sub-libraries



distclean: clean

    -$(DEL_FILE) $(TARGET)

    -$(DEL_FILE)







####### Compile



a.o: a/a.c a/a.h

    $(CC) -c $(CFLAGS) $(INCPATH) -o a.o a/a.c



b.o: b/b.c b/b.h

    $(CC) -c $(CFLAGS) $(INCPATH) -o b.o b/b.c



main.o: m/main.c a/a.h \

        b/b.h

    $(CC) -c $(CFLAGS) $(INCPATH) -o main.o m/main.c



####### Install



install:   FORCE



uninstall:   FORCE



FORCE:

利用qmake生成Makefile文件的更多相关文章

  1. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

  2. 例解 autoconf 和 automake 生成 Makefile 文件

    本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法.主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Con ...

  3. 生成makefile文件编译源文件

    1.利用CodeBlock的cbp文件生成makefile文件 reverse@ubuntu:~/Desktop/CreateMakeFile$ ls cbp2make.linux-x86 freeg ...

  4. 生成Makefile文件全过程

    [1]生成Makefile文件全过程 整体流程如下图: 注意:以下文件根目录为testmake(任意位置新建即可) (1)测试程序 1.1 建立两个目录:mkdir include source 1. ...

  5. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  6. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  7. (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

    Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...

  8. 使用autoconf和automake生成Makefile文件(转)

    Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...

  9. 自动生成Makefile文件

    主要的工具有autoscan, aclocal, autoheader, autoconfig,automake 1 .创建c源文件hello.c #include <stdio.h> i ...

随机推荐

  1. POJ 2352 Stars 线段树 数星星

    转载自 http://www.cnblogs.com/fenshen371/archive/2013/07/25/3214927.html 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标 ...

  2. 从高处理解android与服务器交互(看懂了做开发就会非常的容易)

    今天帮一个朋友改一个bug 他可以算是初学者吧 .我给他看了看代码,从代码和跟他聊天能明显的发现他对客户端与服务器交互 基本 不是很了解.所以我花了更多时间去给他讲客户端与服务器的关系.我觉得从这个高 ...

  3. UNIX网络编程-Select模型学习

    1.相关接口介绍 1.1 select ---------------------------------------------------------------------- #include ...

  4. Android性能优化典范

    来源:http://hukai.me/android-performance-patterns/#jtss-tsina 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主 ...

  5. 修改.gitignore后让其生效

    在使用git的时候我们有时候需要忽略一些文件或者文件夹.我们一般在仓库的根目录创建.gitignore文件在提交之前,修改.gitignore文件,添加需要忽略的文件.然后再做add commit p ...

  6. MySQL 教程分享

    MySQL 教程 MySQL 安装 MySQL 管理与配置 MySQL PHP 语法 MySQL 连接 MySQL 创建数据库 MySQL 删除数据库 MySQL 选择数据库 MySQL 数据类型 M ...

  7. Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法

    <script type="text/javascript"> $('input:text:first').focus(); document.onkeydown = ...

  8. Hibernate之即时更新

    昨天工作中遇到了一个简单的问题,弄了好久,都怪自己没有好好的去了解hibernate,导致了这样的问题弄了两三个小时. 问题是这样的:我想即时更改数据,然后再查询 (1)用Spring的getHibe ...

  9. JQ判断复选框是否选中

    方法一: if($('#checkbox').is(':checked')) {} 方法二:if ($('#checkbox').attr('checked')) {} 方法三:if ($(" ...

  10. JSP 九大内置对象

    JSP 九大内置对象: 一 out对象主要用来向客户端输出各种数据类型内容,并且管理应用服务器上的输出缓冲区.out.print()//输出数据out.newLine()//输出一个换行符out.fl ...