Linux C++;对main进行未定义的引用 我正在研究一个C++项目,用语言稍微刷新一下自己,在使用使生成时,遇到了一个相当奇怪的问题()。

Linux C++;对main进行未定义的引用 我正在研究一个C++项目,用语言稍微刷新一下自己,在使用使生成时,遇到了一个相当奇怪的问题()。,c++,linux,makefile,C++,Linux,Makefile,我的项目设置为以下结构: bin/ include/ src/ Makefile build.sh 我现在有两个文件,loggerConfig.cpp和proxy.cpp。主要方法在proxy.cpp中。My Makefile包含以下内容,这些内容取自: 只需将test.cpp文件向上移动一个目录,即可解决问题并完成所有编译。有人能解释为什么吗?我对make的理解相当简单,所以我不知道用谷歌搜索是为了什么 [编辑] 在shell中直接运行源列表的find命令后,我发现当test.cp

我的项目设置为以下结构:

 bin/
 include/
 src/
 Makefile
 build.sh
我现在有两个文件,loggerConfig.cpp和proxy.cpp。主要方法在proxy.cpp中。My Makefile包含以下内容,这些内容取自:

只需将
test.cpp
文件向上移动一个目录,即可解决问题并完成所有编译。有人能解释为什么吗?我对
make
的理解相当简单,所以我不知道用谷歌搜索是为了什么

[编辑]

在shell中直接运行源列表的
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

该问题是由make文件中的空
$SOURCES
列表引起的,这是find命令
find$(SRCDIR)-type f-iname*$(SRCEXT))
的结果

要解决此问题,需要将该行更新为:

SOURCES:=$(shell find$(SRCDIR)-type f-iname'*.$(srtext)


根据,这是因为shell中断了作为glob模式的
*.cpp
,并将其展开以匹配任何文件,然后再进行查找。因此实际上,正在运行的
find
命令是
find src-type f-iname test.cpp
,它现在返回结果。

这是一个非常奇特的生成文件,您可能会因为过于复杂而给自己带来麻烦

我会这样写:

TARGET=bin/proxy
SOURCES=loggerConfig proxy

$(TARGET): $(SOURCES:%=build/%.o)
    @echo " Linking..."
    $(CC) $^ -o $(TARGET) $(LIB) $(LINKFLAGS)

build/%.o: src/%.cpp
    @echo " Building..."
    test -d build || mkdir -p build
    $(CC) $(CFLAGS) $(INC) -c -o $@ $<
TARGET=bin/proxy
SOURCES=loggerConfig代理
$(目标):$(源:%=build/%.o)
@回声“链接…”
$(CC)$^-o$(目标)$(库)$(链接标志)
build/%.o:src/%.cpp
@回声“建筑…”
测试-d构建| | mkdir-p构建
$(CC)$(CFLAGS)$(INC)-c-o$@$<
也许我只是一个有点老派的人,但在有人受伤之前,玩具有奇特变量替换的游戏是很有趣的。当我屈服于诱惑时,我通常会在以后后悔,并简化生成文件

特别是,这里有两个进一步的观察结果

源集合似乎不太可能是如此动态,以至于在动态生成
变量时值得。当您添加一个文件时,不需要将名称添加到Makefile中,因为如果不添加,程序将无法生成,所以没有忘记的危险


@echo foo条;foo bar
模式肯定是自找麻烦!在某些情况下,您必须调整一个
foo-bar
部分,而不调整另一个,您会感到非常困惑。Make会回显它执行的行,除非您使用
@
前缀停止它,因此您似乎是通过迂回路线合成默认行为。

正如您在这里看到的
g++-o bin/proxy-lconfig++
它找不到任何要编译的源文件。因此,您的
src
文件夹中没有任何源文件,或者find命令不正确。我建议直接在Shell上运行所有这些find命令,看看是否真的找到了源文件。啊,好吧,所以当
test.cpp
文件位于目录中时,出于某种原因,
find
命令没有正确返回。原来它需要在源扩展名周围加上语音标记。虽然当文件不在目录中时它为什么工作,但我不知道你是否解决了问题,你应该将其作为答案发布感谢你的答案,而我的答案解释了为什么我有问题,我会接受这个,因为我认为这最终可能是一个更干净的解决方案。我不知道make是否会回显它默认执行的行;所以我删除了这些内容并简化了make文件。我很高兴它有帮助。你发现的问题很好地说明了花哨的替换可能导致的一般问题。
$ 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
TARGET=bin/proxy
SOURCES=loggerConfig proxy

$(TARGET): $(SOURCES:%=build/%.o)
    @echo " Linking..."
    $(CC) $^ -o $(TARGET) $(LIB) $(LINKFLAGS)

build/%.o: src/%.cpp
    @echo " Building..."
    test -d build || mkdir -p build
    $(CC) $(CFLAGS) $(INC) -c -o $@ $<