【问题标题】:Symbol redefinition error between libxml2 and theoslibxml2和theos之间的符号重定义错误
【发布时间】:2015-12-03 15:02:15
【问题描述】:

我在调整中使用 libxml2,但出现符号重新定义错误。看起来 theos 中的一些 DataAccess-structs.h 使用与 libxml 类似的相同 xmlNode 结构。由于这两个都是可能被其他应用程序使用的共享库,我不确定如何在不破坏所有内容的情况下解决它。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/usr/include/libxml2/libxml/tree.h:488:8: error: 
      redefinition of '_xmlNode'
struct _xmlNode {
       ^
<User_home>/Documents/substrate/theos/include/DataAccess/DataAccess-Structs.h:16:16: note: 
      previous definition is here
typedef struct _xmlNode {

【问题讨论】:

标签: c theos cydia redefinition cydia-substrate


【解决方案1】:

所以我通过了一些选项posted in SO 并认为在运行时动态加载库是最好的。使用 objcopy 或尝试重新链接为静态库并不好,因为它们是跨许多应用程序的共享库。

基本思想是使用dlopendlsymdlclose来完成任务。但是,问题不仅在于链接,还在于编译。要解决编译问题,您有两种选择
a) 使用#define 将符号名称重新定义为shown here
b) 使用抽象指针 (void*) 并完全避免所有 xml 结构。

选项 (a) 的缺点是您必须重新定义 libxml2 和 theos 的每个冲突符号,而选项 (b) 可能会导致使用 void* 或 xml 结构进行错误转换。

我选择了选项 (b),如果你这样做了,你会怎么做

为要使用的 xmlElements 创建一个 typedef 列表。我使用 libxml 作为编写器,因此我定义了所有编写器结构。

typedef void* (*xmlNewTextWriterFilenameFPtr)(const char *uri, int compression);
typedef int (*xmlTextWriterStartDocumentFPtr)(void *writer,const char *version,const char *encoding,const char *standalone);
typedef int (*xmlTextWriterEndDocumentFPtr)(void *writer);

然后对于您必须调用的每个方法,使用 dlopendlsym

void *lib=dlopen(path_to_libxml,RTLD_LOCAL);
const char *func_xmlNewTextWriterFilename = "xmlNewTextWriterFilename";
if(lib == NULL){printf("%s","Problem loading library");} 
xmlNewTextWriterFilenamePtr fptrWriter=(xmlNewTextWriterFilenamePtr)dlsym(lib, func_xmlNewTextWriterFilename);
void *writer=fptrWriter(OUT_FILE_PATH,0);

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多