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

时间:2015-11-13 03:22:43

标签: c++ c linker

基本上,我正在使用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>,它会打印定义符号的目标文件。

2 个答案:

答案 0 :(得分:1)

重置设置:

one.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

2 / two.h:

void two(void);

2 / two.c:

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

2 /生成文件:

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

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

2 /生成文件:

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

答案 1 :(得分:0)

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

#ifdef __cplusplus
extern "C" {
#endif

// Your code

#ifdef __cplusplus
}
#endif

解决了我的问题。