Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 对同一源文件使用不同CFLAG的最佳方法是什么?_Makefile - Fatal编程技术网

Makefile 对同一源文件使用不同CFLAG的最佳方法是什么?

Makefile 对同一源文件使用不同CFLAG的最佳方法是什么?,makefile,Makefile,我需要构建两个相同的源代码树 1-使用普通CFLAG构建项目二进制文件 2-使用cflags plus-fPIC构建一个静态库,该库将是开发项目动态模块的某种SDK 只使用一个Makefile,实现这一点的最佳方法是什么 最好做一些: all: $(OBJECTS) lib_rule: $(OBJECTS) CFLAGS += -fPIC .cpp.o: $(CC) -c $< -o $@ $(CFLAGS) all:$(对象) 库规则:$(对象) CFLAGS+=-f

我需要构建两个相同的源代码树

1-使用普通CFLAG构建项目二进制文件
2-使用cflags plus-fPIC构建一个静态库,该库将是开发项目动态模块的某种SDK

只使用一个Makefile,实现这一点的最佳方法是什么

最好做一些:

all: $(OBJECTS)

lib_rule: $(OBJECTS)
   CFLAGS += -fPIC

.cpp.o: 
   $(CC) -c $< -o $@ $(CFLAGS)
all:$(对象)
库规则:$(对象)
CFLAGS+=-fPIC
.cpp.o:
$(CC)-c$<-o$@$(CFLAGS)
但显然这是不可能的


谢谢

我过去用过的一个不同的扩展:

.cpp.o:
    $(CC) -c $< -o $@ $(CFLAGS)

.cpp.lo:
    $(CC) -c $< -o $@ $(CFLAGS) $(EXTRA_CFLAGS)
假设您使用的是GNU Make,您可以使用一些内置函数,只需维护一次对象列表:

OBJS = a.o b.o
LOBJS = $(patsubst %.o, %.lo, $(OBJS))

在不同的make工具(如CMake)中,您可以更轻松地表达类似的内容

例如,你可以做得很好

set(sources ABC.cpp DEF.cpp XYZ.cpp)
ADD_LIBRARY(mylib STATIC ${sources})
add_executable(myExecutable  ${sources} main.cpp)
或者,您可以通过多次从目录的逻辑父目录中包含同一个目录来重复构建具有不同标志的目录,即

set(MyTweakFlag 2)
add_subdirectory("libDir" "libDir2")
set(MyTweakFlag 3)
add_subdirectory("libDir" "libDir3")
…然后使用子目录中的
if()
或诸如此类来设置正确的标志

特别是如果你有很多这样的配置,使用make会变得非常脆弱;make不能正确地找到递归make依赖项的传递闭包(当然也不能正确地找到makefile本身的依赖项——如果你改变了标志,比如说),所以如果你要做复杂的makefile魔术:用更好的工具来做吧


(CMake恰好是我替换的make,但当然还有其他各种替换方法)

我没有将编译后的
.o
文件放在与源文件相同的目录中,而是将它们创建在标记的子目录中。在您的情况下,可以将静态库文件创建为
source\u dir/lib/*.o
,将普通文件创建为
source\u dir/bin/*.o
。在设置了唯一的
CFLAGS
之后,在不同的构建目标中,只需生成一个包含相应子文件夹名称的
DIR\u NAME
值。您可以在创建编译器在构建和链接时使用的路径时使用此变量。

GNU make还提供了“特定于目标的变量值”。考虑下面的Mag文件:

# Makefile  
CFLAGS := My Cflags

all: $(OBJECTS)  
        @echo "$@ CFLAGS is: " $(CFLAGS)  

lib_rule: CFLAGS += extended by -fPIC  
lib_rule: $(OBJECTS)  
        @echo "$@ CFLAGS is: " $(CFLAGS)  

# Makefile - end.
$makeall
所有的CFLAGS都是:我的CFLAGS
$make lib_规则
lib_规则CFLAGS是:我的CFLAGS由-fPIC扩展
$

(请注意:如果复制并粘贴示例,请记住在命令行前面重新添加制表符。我总是被它抓住。)

+1,这是基于autotools/libtool的项目中通常做的事情。是的,它起作用了,我已经在使用这些宏从变量源获取对象,我想也是一样^^非常感谢。我不想修改源代码树结构,所以第一个答案最适合我的情况。你不必以任何方式更改源代码树结构。二进制对象文件夹的创建/删除将由
make
或您的编译器自动处理。您需要做的唯一更改是在Makefile中。
# Makefile  
CFLAGS := My Cflags

all: $(OBJECTS)  
        @echo "$@ CFLAGS is: " $(CFLAGS)  

lib_rule: CFLAGS += extended by -fPIC  
lib_rule: $(OBJECTS)  
        @echo "$@ CFLAGS is: " $(CFLAGS)  

# Makefile - end.