对“main”的未定义引用crt1.o 函数 _start 中出现错误

发布于 2024-11-01 07:37:39 字数 867 浏览 0 评论 0原文

我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ら栖息 2024-11-08 07:37:39

使用 $^ 代替 $<。后者仅包含第一个依赖项 (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.

始于初秋 2024-11-08 07:37:39

这里有一些提示:

  1. .o 文件不需要 -o $@ $< ,因此从这些目标中删除它。
  2. -Wall 在编译而不是链接时使用更有意义。因此,我会将其添加到 CCCXX 行(或者更好的是添加到 CFLAGSCXXFLAGS) 。
  3. clean 目标应该是 .PHONY 目标的依赖项,以便您可以始终执行它(无需事先检查已更改的依赖项)。

如果您仍然收到有关在 module.c 中缺少对函数的引用的错误,则您可能在 main.cpp 中缺少一些 extern "C" ... 语句。这是因为 C++ 函数的内部名称的计算方式与 C 函数的内部名称不同(我认为 C++ 在所有名称前加上命名空间、类名等前缀)。要告诉 C++ 可以使用旧的内部名称进行链接来找到特定函数,请使用 extern "C" 语句。

Here are a couple of hints:

  1. -o $@ $< is not needed for .o files, so remove that from those targets.
  2. -Wall makes more sense when used while compiling not linking. So I would add it to the CC and CXX line instead (or better, to the CFLAGS and CXXFLAGS).
  3. the clean target should be a dependency of the .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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文