2015-11-13 19 views
3

基本上,我正在用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>,它將打印定義符號的目標文件。未定義的引用,但objdump顯示函數在目標文件中?

+1

是它C或C++。另外,顯示一些示例代碼。您的功能聲明可能與您的功能定義不同。 –

+0

C和C++的混合,會有什麼關係?我會嘗試發佈一些代碼,但聲明絕對符合定義。 – user693861

+2

是的,實際上。例如,[name mangling](https://en.wikipedia.org/wiki/Name_mangling)中的C和C++之間的差異會給你帶來這種悲傷。所以是的,有點重要。 – user4581301

回答

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"); } 

二/ Makefile文件:

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

我做了什麼來解決只是改變二/ Makefile使用克++而不是GCC:

二/ Makefile文件:

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

您可以使用變量$(CC)和$(CXX)來避免麻煩。如果您混合使用語言,請閱讀'extern'C'' –