gcc makefile 拒绝对源文件夹的权限

permission denied to source folder by gcc makefile

我有两个包含 cpp 源文件的目录 (C:\projects\project1\cpputest\src\cpp_sources) (C:\projects\project1\cpputest\src\cpp_second_sources)

我在每个 cpp 源文件所在的目录中创建了两个简单的 makefile。 makefile 只创建一个静态库(windows 平台和 gnu 编译器)"lib.a"。例如:

#Set this to @ to keep the makefile quiet
ifndef SILENCE
    SILENCE = @
endif

CPPUTEST_HOME = C:/projects/project1/cpputest
CPP    = g++
CXXFLAGS = -Wall
SOURCE = $(wildcard *.cpp)
OBJECTS= $(SOURCE:.cpp=.o)
TARGET = lib.a

.SUFFIXES: .cpp

all: $(TARGET)

.cpp.o:
    $(CPP) $(CXXFLAGS) -c $< -o $@

$(TARGET): $(OBJECTS)
    ar -rc $(TARGET) $(OBJECTS)

clean:
    rm -f $(OBJECTS) $(TARGET) 

到目前为止这有效。现在我想 运行 从 "C:\projects\project1" 目录中创建一个 makefile 来为两个源创建一个库 directories.I 修改 makefile 如下:

CPPUTEST_HOME = C:/projects/project1/cpputest
CPP    = g++
CXXFLAGS = -Wall

SOURCE_DIR = $(CPPUTEST_HOME)/src/cpp_sources 
SOURCE_DIR += $(CPPUTEST_HOME)/src/cpp_second_sources

SOURCES = $(wildcard $(SOURCE_DIR)/*.cpp)
OBJECTS= $(SOURCES:.cpp=.o)
TARGET = libgcc.a

.SUFFIXES: .cpp

default: $(TARGET)

.cpp.o:
    $(CPP) $(CXXFLAGS) -c $< -o $@

 $(TARGET): $(OBJECTS)
    ar -rc $(TARGET) $(OBJECTS)

clean:
    rm -f $(OBJECTS) $(TARGET)

输出为:

g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file1.cpp -o     C:/projects/project1/cpputest/cpp_sources/file1.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file2.cpp -o     C:/projects/project1/cpputest/cpp_sources/file2.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file3.cpp -o     C:/projects/project1/cpputest/cpp_sources/file3.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file4.cpp -o     C:/projects/project1/cpputest/cpp_sources/file4.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file5.cpp -o     C:/projects/project1/cpputest/cpp_sources/file5.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file6.cpp -o     C:/projects/project1/cpputest/cpp_sources/file6.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file7.cpp -o     C:/projects/project1/cpputest/cpp_sources/file7.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file8.cpp -o     C:/projects/project1/cpputest/cpp_sources/file8.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file9.cpp -o     C:/projects/project1/cpputest/cpp_sources/file9.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file10.cpp -o     C:/projects/project1/cpputest/cpp_sources/file10.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file11.cpp -o     C:/projects/project1/cpputest/cpp_sources/file11.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file11.cpp -o     C:/projects/project1/cpputest/cpp_sources/file10.o
g++ -Wall -c C:/projects/project1/cpputest/cpp_sources/file12.cpp -o     C:/projects/project1/cpputest/cpp_sources/file12.o
ar -rc libgcc.a C:/projects/project1/cpputest/cpp_second_sources     C:/projects/project1/cpputest/cpp_sources/file1.o     C:/projects/project1/cpputest/cpp_sources/file2.o     C:/projects/project1/cpputest/cpp_sources/file3.o     C:/projects/project1/cpputest/cpp_sources/file4.o     C:/projects/project1/cpputest/cpp_sources/file5.o     C:/projects/project1/cpputest/cpp_sources/file6.o     C:/projects/project1/cpputest/cpp_sources/file7.o     C:/projects/project1/cpputest/cpp_sources/file8.o     C:/projects/project1/cpputest/cpp_sources/file9.o     C:/projects/project1/cpputest/cpp_sources/file10.o     C:/projects/project1/cpputest/cpp_sources/file11.o     C:/projects/project1/cpputest/cpp_sources/file12.o     C:/projects/project1/cpputest/cpp_sources/file13.o
c:\MinGW\bin\ar.exe: C:/projects/project1/cpputest/cpp_second_sources: Permission denied
make: *** [libgcc.a] Error 1

如您所见,目录/cpp_sources 中的所有源代码都已编译并创建了目标文件,在此之后,必须对目录/cpp_second_sources 执行相同的操作。取而代之的是,makefile 在 /cpp_second_sources 目录上调用 ar-rc 命令……这就是奇怪的地方。

啊哈。这样就清楚多了。所以你的问题在这里:

SOURCE_DIR = $(CPPUTEST_HOME)/src/cpp_sources 
SOURCE_DIR += $(CPPUTEST_HOME)/src/cpp_second_sources

SOURCES = $(wildcard $(SOURCE_DIR)/*.cpp)

会发生什么?好吧,你把 SOURCE_DIR 设置为两个不同的目录,所以 SOURCE_DIR 的值是这样的:

$(CPPUTEST_HOME)/src/cpp_sources $(CPPUTEST_HOME)/src/cpp_second_sources

然后你 运行 $(wildcard $(SOURCE_DIR)/*.cpp) 扩展为这样的通配符命令:

$(wildcard $(CPPUTEST_HOME)/src/cpp_sources $(CPPUTEST_HOME)/src/cpp_second_sources/*.cpp)

可能你现在可以看到你的问题了。您不能只写 $(FOO)/bar 并期望在 $(FOO) 的扩展中将后缀 /bar 附加到每个 word;这不是它的工作原理。它只是添加到最后,如所写。

如果您希望 SOURCE_DIR 变量能够保存多个目录,而不仅仅是一个目录,那么首先您应该将其重命名为 SOURCE_DIRS 或更具描述性的名称,其次您必须使用 addsuffix 之类的东西对列表中的所有单词进行操作:

SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCE_DIR))