代码之家  ›  专栏  ›  技术社区  ›  KcFnMi

在makefile上放东西(cflags或cxxflags)的位置?

  •  3
  • KcFnMi  · 技术社区  · 7 年前

    首先 Makefile 这里有

    CFLAGS   = -g -Wall -lm
    

    我在玩 C 那时。现在我在 C++ 我不得不补充 -I eigen ,在上面快速搜索并找到 CXXFLAGS 存在于 C++ 世界,而 CFLAGS 存在于 世界。所以我更新了 生成文件

    CFLAGS   = -g -Wall -lm
    CXXFLAGS = -I eigen
    

    然后我发现 https://wiki.gentoo.org/wiki/GCC_optimization 并被启发再次更新它

    CFLAGS   = -g -Wall -lm
    CXXFLAGS = ${CFLAGS} -I eigen
    

    完整的东西:

    CC       = g++
    CFLAGS   = -g -Wall -lm
    CXXFLAGS = ${CFLAGS} -I eigen
    OBJS     = main.o multiply.o 
    PROGRAM  = multitply
    $(PROGRAM): $(OBJS)
        $(CC) $(OBJS) $(CFLAGS) -o $(PROGRAM)
    

    我应该添加 -我的特征 克星旗 cFLAGS ?

    也注意到了 CPPFLAGS

    我应该换成 $(CC) $(OBJS) $(CXXFLAGS) $(CPPFLAGS) -o $(PROGRAM) $(CC) $(OBJS) -o $(PROGRAM) ?

    我应该换成 $(PROGRAM): $(OBJS) *.h ,因此每当 .h 文件得到更改?

    还有其他改进吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   jfMR    7 年前

    我会用 CFLAGS 编译c文件时 CXXFLAGS 编译C++文件时。此外 cFLAGS 克星旗 您可能遗漏了另一个相关变量: CPPFLAGS

    我应该添加 -I eigen 克星旗 cFLAGS ?

    CPPFLAGS 通常用于提供与预处理器相关的选项。 我将使用此变量指定包含目录:

    CPPFLAGS = -I eigen
    

    另一个有趣的变量,对于提供库很有用,它是 LDLIBS . 你可以利用它传球 -lm :

    LDLIBS = -lm
    

    我应该换成 $(PROGRAM): $(OBJS) *.h ,因此每当 .h 文件得到更改?

    我建议的方法是通过编写不带配方的规则,将头文件的先决条件添加到相应的对象文件中,例如:

    main.o: main.h multiply.h ...
    multiply.o: multiply.h ...
    

    此外, * 不会做你想做的事情,也就是说,在这种情况下它不是通配符。将这些行放在makefile的末尾,这样它们就不会替换默认目标。


    生成文件可能类似于:

    CXXFLAGS = -g -Wall
    CPPFLAGS = -I eigen
    LDLIBS   = -lm
    OBJS     = main.o multiply.o 
    PROGRAM  = multitply
    
    $(PROGRAM): $(OBJS)
       $(CXX) $^ $(LDLIBS) -o $@
    

    无需重复 $(PROGRAM) $(OBJS) 在配方中,您可以简单地使用自动变量。 $@ $^ ,分别是。