未定义的引用,但 objdump 显示函数在目标文件中?

Posted

技术标签:

【中文标题】未定义的引用,但 objdump 显示函数在目标文件中?【英文标题】:Undefined reference, but objdump shows the function is in the object file? 【发布时间】:2015-11-13 03:22:43 【问题描述】:

基本上,我使用g++ -c -o one.o one.c 分别编译几个C 文件,然后尝试将它们与g++ -o one.exe one.o two.o three.o 链接。链接器抱怨对 one.c 调用并在 two.c 中声明的函数的未定义引用。但是如果我这样做objdump -d two.o,函数就在那里,所以我很困惑为什么链接器找不到它们?

e:如果我给链接器选项-y <symbol>,它会打印定义符号的目标文件。

【问题讨论】:

是 C 还是 C++。另外,显示一些示例代码。也许您的函数声明与您对函数的定义不同。 C 和 C++ 的混合,这有关系吗?我会尝试发布一些代码,但声明肯定与定义匹配。 是的,实际上。例如,name mangling 中的 C 和 C++ 之间的差异可能会给您带来这种痛苦。所以,是的,有点重要。 Ughhhhh 就是 @user4581301 - 必须在子目录的 Makefile 中将 gcc 更改为 g++。就是这样。将在几秒钟内发布带有小示例的答案。 很高兴这是一个快速的。 【参考方案1】:

设置重现:

一个.cpp:

#include "two/two.h"
int main(void) 
    two();
    return 0;

生成文件:

all: one

one: one.o two.o
    g++ -o one.exe one.o two/two.o

one.o:
    g++ -c -o one.o one.cpp

two.o:
    $(MAKE) -C two

两个/两个.h:

void two(void);

两个/两个.c:

#include <stdio.h>
#include "two.h"
void two(void)  printf("Two\n"); 

两个/Makefile:

all:
    gcc -c -o two.o two.c

我所做的只是将两个/Makefile 更改为使用 g++ 而不是 gcc:

两个/Makefile:

all:
    g++ -c -o two.o two.c

【讨论】:

您可以使用变量 $(CC) 和 $(CXX) 来避免麻烦。如果您混合使用语言,还请阅读“extern "C"”【参考方案2】:

我也发生了完全相同的事情。 在头文件(.h)中做

#ifdef __cplusplus
extern "C" 
#endif

// Your code

#ifdef __cplusplus

#endif

解决了我的问题。

【讨论】:

以上是关于未定义的引用,但 objdump 显示函数在目标文件中?的主要内容,如果未能解决你的问题,请参考以下文章

将 cuda 目标文件 .cu.o 与 CMake 链接原因:在函数 `__sti____cudaRegisterAll()' * 未定义引用 `__cudaRegisterLinkedBinary

未定义的引用(但 nm 表示该函数存在)[重复]

函数未在 HTMLFormElement.onsubmit 中定义 [重复]

objdump

C语言里面对啥未定义引用是啥意思?

使用readelf和objdump解析目标文件 ***