makefile及条件编译

来源:互联网 发布:金庸群侠传2秘籍数据 编辑:程序博客网 时间:2024/05/17 22:22

makefile及条件编译

分类: makefile 1090人阅读 评论(0) 收藏 举报
makefilelinuxcommandmysqlgcc平台
 

//getword.cc

#include<iostream>
#include<string>
using namespace std;
int main()
{
string word;
#ifdef LINE
while(getline(cin,word))
    cout<<word<<endl;
#else
while(cin>>word)
    cout<<word<<endl;
#endif
return 0;
}
上面是源文件,此程序的目的是根据条件决定是要用每次一行输入还是一个单词输入,基于此可以写一个makefile如下:

MYDEF=-DLINE
GCC=g++   
getword:getword.o
     ${GCC}   getword.o -o   getword //此处注意一定要以一个Tab键作为开头
getword.o : getword.c   
      ${GCC} ${MYDEF} -c   getword.cc -o   getword.o
之后直接在终端输入make getword即可生成getword可执行文件

makefile的基本规则是:

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

    target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

    prerequisites就是,要生成那个target所需要的文件或是目标。

    command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容

 

=================================================================================

 

 

近期在做32位程序移植到64位环境下的工作,为了使32位和64位系统下编译程序使用一个makefile,需要条件编译,找到了两种方法。下面的两种方法以使用linux的mysql为例。
 
方法1:使用变量决定使用到库的路径,如下所示:
LINUX_VERSION=64
    ifeq ($(LINUX_VERSION),64)
        LIB= -L/usr/lib64/mysql
    else
        LIB=-L/usr/lib/mysql
    endif
$(EXEC):$(OBJS)
    g++ -Wall -I. -L. $(LIB) -o $@ $^ -lpthread -lstdc++ -lmysqlclient
当把LINUX_VERSION设置为64时,在64位下编译,使用/usr/lib64/mysql路径的mysql库,当把LINUX_VERSION设置为32时,在32位下编译,使用/usr/lib/mysql路径的mysql库。
 
方法2:通过makefile的命令行参数决定编译环境。如下例,通过添加了V变量,命令行参数给V赋值,在makefile中使用变量V判断使用库的路径。
    ifeq ($(V),64)
    LIB= -L/usr/lib64/mysql
else
    LIB=-L/usr/lib/mysql
endif
$(EXEC):$(OBJS)
g++ -Wall -I. -L. $(LIB) -o $@ $^ -lpthread -lstdc++ -lmysqlclient
使用如下:
    命令行输入:makefile V=64           // 表示在64位平台上编译,
    命令行输入:makefile                // 无参数表示在32位平台上编译
    同样在linux和arm交叉编译环境中编译使用上述方法很用,如:
ifeq ($("这里是自己定义的变量"),ARM)
    CC=arm_linux_gcc
else
    CC=gcc
endif
方法1是通过手动修改makefile实现,方法2通过命令行传参实现。在makefile里可以自动检测出当前环境是32还是64位,有待进一步研究。
原创粉丝点击