gpt4 book ai didi

c - libxml2和theos之间的符号重定义错误

转载 作者:行者123 更新时间:2023-12-02 04:46:34 24 4
gpt4 key购买 nike

我在调整中使用 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 {

最佳答案

所以我经历了一些选择 posted in SO并认为在运行时动态加载库是万恶之源。使用 objcopy 或尝试重新链接为静态库并不好,因为这些是跨许多应用程序的共享库。

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

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

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

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

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

关于c - libxml2和theos之间的符号重定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32449123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com