在C和C ++中,链接器如何使用已实现的函数找到正确的文件?

时间:2015-08-23 04:38:22

标签: c++ c linker

这是我在C中的代码。我已经习惯了Java,因此我不了解C编译器如何使用已实现的方法找到正确的源文件。

例如,如果我将sample_c1.cpp文件与Main.cpp一起放入,它将转到sample_c1.cpp的on_start()。如果我删除sample_c1.cpp并将sample_c2.cpp与Main.c放在一起,它将转到sample_c2.cpp的on_start()。

这是我的测试程序:

MAIN.C

//no includes to sample_c1.cpp or sample_c2.cpp

void on_start();
void on_stop();
int main(int argc, char* argv[]){

    on_start();
    return 0;
}

sample_c1.cpp

//this is all i have in the file no class definition no nothing just implementations of the methods 
void on_start(){
    ....
}

void on_stop(){
    ......
}

sample_c2.cpp

//this is all i have in the file no class definition no nothing just implementations of the methods 
void on_start(){
    ....
}

void on_stop(){
    ......
}

2 个答案:

答案 0 :(得分:1)

通常,使用具有外部链接的符号的多个定义编译程序会导致未定义的行为。

实际上,链接器通常会在执行此操作时抛出错误。

答案 1 :(得分:1)

IDE会告诉编译器*项目中所有源文件的名称。编译器*一次处理它们。如果它看到你正在调用未在同一源文件中定义的函数,那么它将查看其他源文件。如果你有一个名为sample_c1.cpp的文件,它会在那里看。如果你有一个名为sample_c2.cpp的文件,它会在那里看。如果您有一个名为travel_back_in_time_and_murder_hitler.cpp的文件,那么它将会显示在那里。

真的没有什么令人兴奋的事情发生。 Java中没有“类路径”。只是一堆制作程序的源文件。

*实际上是链接器,但编译器和链接器之间的区别超出了这个问题的范围。它基本上只是编译器的另一部分。