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

来源:互联网 发布:淘宝陶瓷店知乎 编辑:程序博客网 时间:2022/08/17 12:14

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

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

0 0