调用动态库导致符号无法解析错误

error:符号无法解析

标签(空格分隔):vs c/c++


http://blog.csdn.net/hust_sheng/article/details/52829188

符号无法解析的常见原因

  • 头文件包含出错,导致链接过程找不到源文件
  • lib或dll引入失败(静态库或动态库配置问题)
  • 调用动态库的情况下,跨工程引入头文件导致的符号解析错误

对第三种情况进行详细说明

  较为大型的项目常常会设置较多个工程,以其中一个工程为主工程(包含main函数),且该主工程通过调用其他子工程的静态库或动态库中的相关函数完成处理过程。如果主工程调用子工程的过程中使用的是动态库的形式(即子工程可在创建的时候设置为动态库),此时的函数调用不能include头文件以及相应的.c文件,否则就会出现符号无法解析的error,原因就是对于动态库而言,除非我们指定相应的接口可见,否则函数接口是不可见的。需要注意的是如果该子工程在创建的时候设置为静态库,那么我们还是可以通过include的形式进行函数链接(正常的形式)。
  出现上述问题,解决的方法很简单,使用动态库常用的函数调用策略即可:在其他工程中所需的相应函数前使用关键字__declspec(dllexport)进行声明。

  • 动态库的调用形式

    • 静态调用(在工程属性中进行相应的设置)
    • 动态调用

      HMODULE inst_lib;
      if (sizeof(void*) == 8) {
          inst_lib = LoadLibrary("project0.dll");
      } else {
          inst_lib = LoadLibrary("project1.dll");
      }
      
      if (inst_lib == NULL) {
          fprintf(stderr, "Load library error.\n");
          return -1;
      }
      
      lib_create = (name_lib_create_t)GetProcAddress(inst_lib, "name_lib_create");
      lib_decode = (name_lib_decode_t)GetProcAddress(inst_lib, "name_lib_decode");
      lib_destroy = (name_lib_destroy_t)GetProcAddress(inst_lib, "name_lib_destroy");
      lib_flush = (name_lib_flush_t)GetProcAddress(inst_lib, "name_lib_flush");
      

      动态调用的好处:在链接的时候不需要考虑动态库的加载和函数的链接问题,当程序运行到这里的时候才会进行加载和链接操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值