西西软件下载最安全的下载网站、值得信赖的软件下载站!

首页编程开发其它知识 → 引用编译libxml遇到multiple definition 报错问题的解决方案

引用编译libxml遇到multiple definition 报错问题的解决方案

相关软件相关文章发表评论 来源:西西整理时间:2013/4/3 9:56:18字体大小:A-A+

作者:西西点击:0次评论:1次标签: 报错

  • 类型:办公软件大小:257KB语言:中文 评分:7.5
  • 标签:
立即下载

问题原因:
当多个文件包含同一个头文件时,并且你的.H里面没有加上条件编译
#ifndef test_H
#define TEST_H
#endif
就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

编译报错:

multiple definition of `xmlMemStrdup' GStreamPlayerline 75, external location: c:\mingw\lib\gcc\mingw32\4.6.2\include\c++\iostreamC/C++ Problem
multiple definition of `xmlMalloc' GStreamPlayerline 75, external location: c:\mingw\lib\gcc\mingw32\4.6.2\include\c++\iostreamC/C++ Problem
multiple definition of `forbiddenExp' CGStreamBuilder.cpp/GStreamPlayer/Src line 246C/C++ Problem
multiple definition of `xmlMallocAtomic' GStreamPlayerline 75, external location: c:\mingw\lib\gcc\mingw32\4.6.2\include\c++\iostreamC/C++ Problem
multiple definition of `emptyExp' CGStreamBuilder.cpp/GStreamPlayer/Src line 246C/C++ Problem
multiple definition of `xmlRealloc' GStreamPlayerline 75, external location: c:\mingw\lib\gcc\mingw32\4.6.2\include\c++\iostreamC/C++ Problem
multiple definition of `xmlFree' GStreamPlayerline 75, external location: c:\mingw\lib\gcc\mingw32\4.6.2\include\c++\iostreamC/C++ Problem

解决方法:

定义宏:LIBXML_STATIC

在头文件xmlexports.h 中有如下问题:

#if defined(_WIN32) && defined(__MINGW32__)
  #undef XMLPUBFUN
  #undef XMLPUBVAR
  #undef XMLCALL
  #undef XMLCDECL
  /*
   * if defined(IN_LIBXML) this raises problems on mingw with msys
   * _imp__xmlFree listed as missing. Try to workaround the problem
   * by also making that declaration when compiling client code.
   */
  #if !defined(LIBXML_STATIC)
    #define XMLPUBFUN __declspec(dllexport)
    #define XMLPUBVAR __declspec(dllexport)
  #else
    #define XMLPUBFUN
    #if !defined(LIBXML_STATIC)
      #define XMLPUBVAR __declspec(dllimport) extern
    #else
      #define XMLPUBVAR extern
    #endif
  #endif
  #define XMLCALL __cdecl
  #define XMLCDECL __cdecl
  #if !defined _REENTRANT
    #define _REENTRANT
  #endif
#endif

其他方法:

方法1:
给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。

方法2:
当方法1无效时,可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();
然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。

方法3:
懒人方法,在所有的全局变量前加上static ,声明成静止变量。也能解决问题。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(1)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)
    推荐文章

    没有数据