未定义引用,但 objdump 显示该函数位于目标文件中?

use*_*861 5 c c++ linker

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

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

设置重现:

一个.cpp:

#include "two/two.h"
int main(void) {
    two();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

生成文件:

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
Run Code Online (Sandbox Code Playgroud)

两个/两个.h:

void two(void);
Run Code Online (Sandbox Code Playgroud)

两个/两个.c:

#include <stdio.h>
#include "two.h"
void two(void) { printf("Two\n"); }
Run Code Online (Sandbox Code Playgroud)

二/Makefile:

all:
    gcc -c -o two.o two.c
Run Code Online (Sandbox Code Playgroud)

use*_*861 3

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

二/Makefile:

all:
    g++ -c -o two.o two.c
Run Code Online (Sandbox Code Playgroud)