【发布时间】:2015-09-18 09:20:11
【问题描述】:
我正在开发一个 C++ 项目,以使自己对这门语言有所了解,但在使用 make 构建时遇到了一个(对我而言)相当奇怪的问题。
我的项目设置如下:
bin/
include/
src/
Makefile
build.sh
我src 我目前有 2 个文件,loggerConfig.cpp 和 proxy.cpp。主要方法在proxy.cpp 中。我的 Makefile 包含以下内容,取自 this post:
CC := g++
SRCDIR := src
BUILDDIR := build
TARGET := bin/proxy
SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -iname *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
LINKFLAGS = -pthread -std=c++11
CFLAGS := -g -Wall -pedantic -std=c++11 -pthread
LIB := -lconfig++
INC := -I include
$(TARGET): $(OBJECTS)
@echo " Linking..."
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB) $(LINKFLAGS)
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
@echo " Building..."
@mkdir -p $(BUILDDIR)
@echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<
clean:
@echo " Cleaning...";
@echo " $(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)
..PHONY: clean
除非我在 Makefile 所在的目录中有一个 .cpp 文件,否则一切正常。因为我目前正在玩,所以在我将一些东西放入我的项目之前,我将在 test.cpp 文件中制作一个小型独立应用程序。当我这样做并切换回使用 make 时,我会收到以下错误:
$ make clean ; make
Cleaning...
rm -f -r build bin/proxy
Linking...
g++ -o bin/proxy -lconfig++
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [bin/proxy] Error 1
只需将test.cpp 文件上移一个目录即可解决问题并编译。谁能解释为什么?我对make 的理解相当简单,所以我不知道谷歌是为了什么......
[编辑]
直接在 shell 中为 SOURCES 列表运行 find 命令后,我发现当存在 test.cpp 文件时它没有返回任何结果。
$ ls
bin build.sh include log Makefile src test.cpp
$ find src -type f -iname *.cpp
$ mv test.cpp ../
$ find src -type f -iname *.cpp
src/proxy.cpp
src/loggerConfig.cpp
【问题讨论】:
-
正如你在这里看到的
g++ -o bin/proxy -lconfig++它没有找到任何要编译的源文件。因此,要么您的src文件夹中没有任何源文件,要么 find 命令不正确。我建议直接在你的 Shell 上运行所有这些 find 命令,看看是否真的找到了你的源文件。 -
啊,好吧,当
test.cpp文件在目录中时,由于某种原因find命令没有正确返回。原来它需要围绕源扩展名的语音标记。虽然当文件不在目录中时它为什么工作我不知道 -
如果你解决了问题,你应该把它作为答案发布