Linux c++对main做了未定义的引用
Linux C++ make undefined reference to main
我正在做一个c++项目来刷新一下自己的语言,并且在使用make
构建时遇到了一个相当奇怪的(对我来说)问题。
我的项目是用以下结构设置的:
bin/
include/
src/
Makefile
build.sh
我是src
我目前有2个文件,loggerConfig.cpp和proxy.cpp。主要方法在proxy.cpp中。我的Makefile包含以下内容,摘自这篇文章:
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
一切工作如预期,除非我有一个。cpp文件在相同的目录作为我的Makefile。因为我目前正在玩游戏,所以在我将某些内容放入我的项目之前,我会在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
这是一个相当奇特的Makefile,您可能会因为过于复杂而给自己带来麻烦。
我可以这样写:
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 $@ $<
也许我只是有点老派,但是玩花哨的变量替换游戏很有趣,直到有人受伤,当我屈服于诱惑时,我通常最终会后悔,并简化了Makefile。
特别地,这里有两个进一步的观察。
源集似乎不太可能如此非常动态,以至于值得动态生成SOURCES
变量。当您添加一个文件时,无需费力地将名称添加到Makefile中,并且由于如果您不这样做,程序将无法构建,因此不会有忘记的危险。
@echo foo bar; foo bar
图案肯定是自找麻烦!在某些情况下,您必然会调整foo bar
部分中的一个而不调整其他部分,并且您将获得非常困惑。Make回显它执行的行,除非您用@
前缀停止它,所以您似乎是通过迂回路由合成默认行为。
这个问题是由make文件中$SOURCES
列表为空引起的,因为find命令find $(SRCDIR) -type f -iname *.$(SRCEXT))
。
要解决这个问题,这一行需要更新为:
SOURCES := $(shell find $(SRCDIR) -type f -iname '*.$(SRCEXT)')
根据这个答案,这样做的原因是由于shell将*.cpp
中断为glob模式,并在传递到查找之前将其扩展为匹配任何文件。因此,运行的find
命令实际上是现在返回结果的find src -type f -iname test.cpp
。
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用