对“main”的未定义引用crt1.o 函数 _start 中出现错误
我的 Makefile 遇到问题。
我正在尝试从 2 个文件创建一个程序 - main.cpp 包含 main 函数,modules.c 包含 main() 中调用的函数的定义。 module.c仅包含函数定义,没有主函数。
我的 Makefile 如下:
CC := gcc
CXX := g++
LINK := g++ -Wall
CFLAGS := -g
CXXFLAGS := -g
TARGET = program
$(TARGET): modules.o main.o
$(LINK) -o $@ $< -lpcap
clean:
rm *.o $(TARGET)
modules.o:
$(CC) $(CFLAGS) -c modules.c -o $@ $<
main.o:
$(CXX) $(CXXFLAGS) -c main.cpp -o $@ $<
我在 main.cpp 中包含了“modules.h”,其中包含所有函数声明。 CFLAGS 和 CXXFLAGS 变量指向包含的正确路径
当我尝试使用此 Makefile 进行制作时,出现错误
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/crt1.o:在函数“_start”中:
(.text+0x20):对“main”的未定义引用
如果我在 $(TARGET) 行中切换 module.o 和 main.o 的顺序,则会收到错误,提示“对函数的未定义引用”我已经在modules.c、main.cpp中定义了。
我不知道出了什么问题。
谢谢。
问候, 雷恩
I've having problems with my Makefile.
I'm trying to create a program from 2 files - main.cpp that contains the main function, and modules.c that contains the definitions of the functions that are called in main(). modules.c only contain function definitions, no main function.
My Makefile is as follows:
CC := gcc
CXX := g++
LINK := g++ -Wall
CFLAGS := -g
CXXFLAGS := -g
TARGET = program
$(TARGET): modules.o main.o
$(LINK) -o $@ lt; -lpcap
clean:
rm *.o $(TARGET)
modules.o:
$(CC) $(CFLAGS) -c modules.c -o $@ lt;
main.o:
$(CXX) $(CXXFLAGS) -c main.cpp -o $@ lt;
I have included "modules.h", which contains all the function declarations, in my main.cpp. The CFLAGS and CXXFLAGS variables point to the correct paths containing
When I try to make using this Makefile, I get the error
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/crt1.o: In function '_start':
(.text+0x20): undefined reference to 'main'
If I switch the order of modules.o and main.o in my $(TARGET) line, then I get errors that say "undefined reference to" the functions I have defined in modules.c, in main.cpp.
I don't know what is wrong.
Thank you.
Regards,
Rayne
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 $^ 代替 $<。后者仅包含第一个依赖项 (modules.o),因此 main.o 未链接到可执行文件中。
Use $^ instead of $<. The latter contains only the first dependency (modules.o), so main.o is not linked into the executable.
这里有一些提示:
-o $@ $<
,因此从这些目标中删除它。-Wall
在编译而不是链接时使用更有意义。因此,我会将其添加到CC
和CXX
行(或者更好的是添加到CFLAGS
和CXXFLAGS
) 。.PHONY
目标的依赖项,以便您可以始终执行它(无需事先检查已更改的依赖项)。如果您仍然收到有关在 module.c 中缺少对函数的引用的错误,则您可能在 main.cpp 中缺少一些
extern "C" ...
语句。这是因为 C++ 函数的内部名称的计算方式与 C 函数的内部名称不同(我认为 C++ 在所有名称前加上命名空间、类名等前缀)。要告诉 C++ 可以使用旧的内部名称进行链接来找到特定函数,请使用 extern "C" 语句。Here are a couple of hints:
-o $@ $<
is not needed for .o files, so remove that from those targets.-Wall
makes more sense when used while compiling not linking. So I would add it to theCC
andCXX
line instead (or better, to theCFLAGS
andCXXFLAGS
)..PHONY
target, so that you can execute it always (without previous check for changed dependencies).If you still get an error about missing references to your functions from modules.c, you are probably missing some
extern "C" ...
statements in main.cpp. That's because the internal name of C++ functions is calculated differently than that from C functions (i think C++ prefixes all names with the namespace, class names, etc). To tell C++ that a specific function can be found using the old internal name for linkage, use the extern "C" statement.