我在写一个关于采集卡的程序,include了采集开开发包自带的头文件,链接了Lib,然后调用了相关函数,得到了视频信号并且成功的显示在了视频上……
BUT,当我准备对视频进行设置的时候,我发现很有些函数,在代码里面调用的时候,写的时候不报错(因为用的是 VS2012,写代码能够提示语法错误),但是编译的时候居然报错了:1>UltrasonicSystemDlg.obj : error LNK2019: 无法解析的外部符号 "long __cdecl DSStream_SaveToJpgFile(int,wchar_t const *,int)" (?DSStream_SaveToJpgFile@@YAJHPB_WH@Z),该符号在函数 "public: void __thiscall CUltrasonicSystemDlg::OnBnClickedButtonCapture(void)" (?OnBnClickedButtonCapture@CUltrasonicSystemDlg@@QAEXXZ) 中被引用
1>C:\Users\Administrator\Desktop\EndVersion\UltrasonicSystem\Debug\UltrasonicSystem.exe : fatal error LNK1120: 1 个无法解析的外部命令放在一般情况下,这个意思就应该是这个函数在DLL里面没有实现吧?但是这是工业成品的库,怎么会有这种情况呢,不止这一个函数,里面的很多函数都是这样的。搞的我刚把视频播放出来,调节不了了,无可奈何,跪求大神相助!
PS:头文件里面这些函数的声明都有,但是编译的时候报错了。不知道是不是版本问题,我用的是VS2012。这个库貌似是6.0里面用的。不过应该没有太大问题吧??DLL找不到函数VS2010 MFC采集卡求大神

解决方案 »

  1.   

    我发现厂家提供的程序里面可以使用那些库,厂家的编译器是VC6,但是我用的是VS2012。会不会是编译器的问题啊?要是是,该怎么解决呢?
      

  2.   

    应该不用怀疑,就是编译器的问题。要知道VS2012较之VS6还是变化很大的。
      

  3.   

        可以下载个VC6试试,VC6软件不大,最好装在别的计算机上,如果VC6没问题,就这么干:在VC6下你再自己编个DLL,这个DLL再调用厂家提供的DLL,成功后你把自己的DLL的源代码拿到VS2012下重新编绎一次,再试试在VS2012下是否能调用你的DLL及厂家的DLL。
        按现象描述不应该是版本造成的函数不匹配,好象是函数定义和实现体不一致造成的
      

  4.   

    那这么办呢?what should i do!!!马上要检查进度,要是我在今晚之前还没有弄出来,,大家就只能在路边看到我了
      

  5.   


    额,这貌似有点繁重啊,不过貌似最后还是调用的是厂家的库,如果直接调用不行,间接调用会不会也不行呢?唉,I will try it
      

  6.   

    对了,厂家提供了一个lib,一个dll,一个.h,是不是有的函数在lib里面,有的函数在dll里面,而所有函数的声明都放在.h里面???
      

  7.   

    用 GetProcAddress 试试 。
      

  8.   

    那这么办呢?what should i do!!!马上要检查进度,要是我在今晚之前还没有弄出来,,大家就只能在路边看到我了如果真的是这样,我建议你离职算了。
    这样的公司,这样的进度要求,走人算了。
      

  9.   

    插一句:用Depends.Exe检查一下到底需要哪些依赖库。
      

  10.   

    工程的配置和你的是一样的。
    不间的要和我一样,我的意思是试试别的配置类型
    改了所有配置,发现还是不行,,被BOSS骂了……
      

  11.   


    这是Depends的依赖项,大神们可不可以帮忙分析一下?
      

  12.   

    是不是 头文件 里没 extern “C”?
      

  13.   

    别去折腾那个dll了,编译错误和dll没关系,运行错误才和dll有关系,编译不通过是和lib有关系。
    VS-工具-VisualStudio命令提示:
    dumpbin.exe /EXPORTS 你的lib路径和名字.lib
    查看这个lib里有没有DSStream_SaveToJpgFile?
    它的调用约定是不是__cdecl?
      

  14.   

    这个工具可以查看到lib中导出的函数原型,你看看和你.h头文件中声明的是否完全一致
      

  15.   


    ?DSStream_SaveToJpgFile@@YAJHPBDH@Z (long __cdecl DSStream_Sav
    eToJpgFile(int,char const *,int))这是从这个工具里面弄出来的。大神,该怎么办呢?
      

  16.   

    这是C++对函数名的 修改,各种编译器的 修改方法 不一样,既然是 C++ 调用,那么 就 不应该 有 
     extern “C”这个lib 和 dll 是不是 不对应 ? 
      

  17.   


    ?DSStream_SaveToJpgFile@@YAJHPBDH@Z (long __cdecl DSStream_Sav
    eToJpgFile(int,char const *,int))这是从这个工具里面弄出来的。大神,该怎么办呢?仔细看就能找到错误原因了
    编译器报错:
    无法解析的外部符号 "long __cdecl DSStream_SaveToJpgFile(int,wchar_t const *,int)
    查看LIB导出的函数原型为:
    long __cdecl DSStream_Sav
    eToJpgFile(int,char const *,int)看看,有什么区别,第二个参数,wchar_t const *和char const *。字符集问题。
    你的.h头文件声明的是wchar_t const *,而实际上LIB导出的是char const *解决办法有两个:
    1.修改你整个工程的字符集为多字节字符集,项目-XX属性-配置属性-常规-字符集-使用多字节字符集
    2.修改.h头文件此函数的声明,第二个参数为char const *不行的话,另外把它提供给你的.h头文件里的DSStream_Sav
    eToJpgFile函数的声明贴出来帮你看下。它是不是用了TCHAR还是它的.h有错
      

  18.   


    ?DSStream_SaveToJpgFile@@YAJHPBDH@Z (long __cdecl DSStream_Sav
    eToJpgFile(int,char const *,int))这是从这个工具里面弄出来的。大神,该怎么办呢?仔细看就能找到错误原因了
    编译器报错:
    无法解析的外部符号 "long __cdecl DSStream_SaveToJpgFile(int,wchar_t const *,int)
    查看LIB导出的函数原型为:
    long __cdecl DSStream_Sav
    eToJpgFile(int,char const *,int)看看,有什么区别,第二个参数,wchar_t const *和char const *。字符集问题。
    你的.h头文件声明的是wchar_t const *,而实际上LIB导出的是char const *解决办法有两个:
    1.修改你整个工程的字符集为多字节字符集,项目-XX属性-配置属性-常规-字符集-使用多字节字符集
    2.修改.h头文件此函数的声明,第二个参数为char const *不行的话,另外把它提供给你的.h头文件里的DSStream_Sav
    eToJpgFile函数的声明贴出来帮你看下。它是不是用了TCHAR还是它的.h有错大神,按照解决办法的第一条中终于解决了问题,太感谢了,困扰了一个星期啊!!!!!!!!!!!!!!!!!!!!!!!!