我想知道VC6.0中链接器是如何通过h文件知道对应的lib文件的比如我调用一个dll,将h文件include进来,设置好include files 以及library files 路径就编译链接了
那么我想知道程序调用了h文件中的函数,在链接时怎么知道要到那个lib文件中找到函数在DLL中的位置?
即h文件和lib文件是怎么关联的?难道通过一样的名称?
如果有两个库,其中有两个函数同名同参数但功能不同,分别在一个程序的不同地方包含两个库的头文件并调用这两个函数,编译器是怎样选择从哪个库中链接的?

解决方案 »

  1.   

    所以vc6的工程设置中要添加对应的lib文件名称以及它的目录位置,编译器会默认找当前目录,但是你要告诉它lib的名称
      

  2.   

    肯定是要设置lib文件的名称的。
    可能头文件里面有 #pragma comment(lib, "xxx.lib")
      

  3.   

    1.在连接的时候,会在各个库中寻找函数,找不到就报错
    2.不是通过函数名,而是函数签名,cpp的重载机制就是基于函数签名不同的,呵呵
      

  4.   

    1.在连接的时候,会在各个库中寻找函数,找不到就报错 
    意思就是如果我用#pragma comment(lib, "xxx.lib")添加了多个lib文件,
    那程序就在这多个lib文件中查找是否有某个lib文件中的函数跟本函数匹配,如果匹配再进行链接?
      

  5.   


    有可能
    1.
    如果是多个的话,估计会调用最先找到的匹配着,
    也就是说,其他几个lib中的同名功能相异的函数就不能调用了。
    2.
    也可能出现编译器被你唬弄了,反过来唬弄你,随机调用,不确定。
    你可以在lib的函数内添加输出信息尝试一下,用MessageBox。
      

  6.   

    两个 lib 里面有定义完全相同的函数,链接的时候就报错了
      

  7.   

    to marrco2005:那么也就是说,链接器确实是在加载的各个lib文件中搜索以找到与函数匹配的lib文件,
    而不是在链接前就知道这个头文件里面的函数要连接某个特定的lib文件?
      

  8.   


    搂主要自己尝试一下了,如果真是 marrco2005所说的那样,那就是编译链接后才知道对应的函数是否有重复或者匹配了。相似的情况,如果在lib内有一个函数是void get(int n);
    而在工程内,某个cpp文件内也有一个  void get(int n);
    链接的时候就会报错!