用于在不同平台上编译的编译器指令

时间:2009-11-11 05:44:56

标签: makefile

我正在编译一个演示项目。

该项目是为windows和linux编写的。我写了一个Makefile。但是,我不确定如何指定编译器将要编译的平台。

我将在Linux上进行编译。

在我的源文件中,我有这个:

#if defined(WIN32)
#include ...
#include ...
#elif defined(LINUX)
#include ...
#include ..
#else
#error "OS not supported"
#endif

我的简单Makefile就是这个。当我编译时,我得到错误“操作系统不受支持”。

如何添加指令以便使用#elif定义(LINUX)进行编译。

LIBS_PATH = -L/usr/norton/lib
INC_PATH = -I/usr/norton/include

LIBS = -lntr

app: *.cpp *.h Makefile

    g++ $(LIBS_PATH) $(INC_PATH) *.cpp -o app

非常感谢任何建议,

2 个答案:

答案 0 :(得分:1)

决定哪个将成为您的默认平台 - 比如LINUX。

LIBS_PATH = -L/usr/norton/lib
INC_PATH  = -I/usr/norton/include
LIBS      = -lntr
PLATFORM  = -DLINUX
CXX       = g++

app: *.cpp *.h Makefile
    ${CXX} ${CFLAGS} ${PLATFORM} ${INC_PATH} *.cpp -o $@ ${LIBS_PATH} ${LIBS}

您可以使用圆括号代替大括号。这为C ++编译器使用了一个宏,允许你通过CFLAGS添加其他标志(尽管通常也是由'make'设置),并将一个平台,包含路径,库路径和实际库添加到编译行

请注意,每当有任何更改时,您的规则都会强制执行所有内容的完整重新编译。这是“安全的”但不一定有效。请注意,通配符也是危险的 - 对于源而言比通常更多。您可以在构建中包含该文件的备份副本(old-reader.cpp - 您实际上只需要reader.cpp)。更常见的是,列出程序所需的目标文件,以便在需要时可以单独重建每个目标文件,并将结果链接在一起。如果你的依赖关系正确(适度大'if'),那就没问题了。如果你弄错了,你最终会得到不一致的程序。

但是,如果差异在5秒重新编译和5分钟重新编译之间,您应该重新编译5分钟(如图所示)并在等待时回答另一个SO问题。

在Linux(64位)上编译:

make CFLAGS="-m64"

在Linux(32位)上编译:

make CFLAGS="-m32"

在Windows 64上编译:

make PLATFORM=-DWIN64

在Windows 32上编译:

make PLATFORM=-DWIN32

答案 1 :(得分:1)

编译时可以添加-DLINUX = 1。

另外,如果您运行:

echo "" | cpp -dD

编译时可以看到默认的#define列表。在linux中,总会有一个:

#define __linux__ 1

在输出中。因此,如果您通过上述#define更改LINUX,则无需执行任何特殊操作。即:

...
#elif defined(__linux__)
...

至于Makefile本身,我会做类似的事情:

CXX=g++
CPPFLAGS = -I/usr/norton/include
LDFLAGS = -L/usr/norton/lib -lntr
OBJ_FILES = one.o two.o

app: $(OBJ_FILES) Makefile

one.o: one.cpp one.h

two.o: two.cpp two.h

因此使用隐式规则。