【问题标题】:compiler directive for compiling on different platforms用于在不同平台上编译的编译器指令
【发布时间】:2009-11-11 05:44:56
【问题描述】:

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

该项目是为 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

非常感谢您的任何建议,

【问题讨论】:

    标签: makefile


    【解决方案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)。更常规地,您列出程序所需的目标文件,以便在需要时可以单独重建每个目标文件,并将结果链接在一起。如果您的依赖关系正确(一个中等大的“如果”),那么就没有问题。如果你弄错了,你可能会得到不一致的程序。

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

    在 Linux(64 位)上编译:

    make CFLAGS="-m64"
    

    在 Linux(32 位)上编译:

    make CFLAGS="-m32"
    

    在 Windows 64 上编译:

    make PLATFORM=-DWIN64
    

    在 Windows 32 上编译:

    make PLATFORM=-DWIN32
    

    等等

    【讨论】:

    • 规则目标文件名。请参阅 web.mit.edu/gnu/doc/html/make_10.html#SEC94 的制作手册
    • 正如 Gonzalo 所说,它是目标的名称;在这种情况下,这意味着“app”,但这意味着您可以将其重命名为“killer-app”,并且您不必更改编译器命令行 - 名称会自动更改。实际上,您可能会注意到该命令行上唯一的非宏是 '*.cpp' 和 '-o' 选项。后者是 POSIX 强制要求的——所以它非常安全;前者应该是 '${OBJECTS}' 左右。通常,命令行中的非宏应该很少,因为您可以轻松更改宏,但不能更改文字。
    【解决方案2】:

    编译时可以加上-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
    

    所以使用了隐式规则。

    【讨论】:

    • 是的,但他如何在给定的基础架构中做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多