2011-01-28 49 views
4

我移植的ODBC驾驶员WindowsLinux
驱动程序写在C
的方式ODBC作品上Linux是,应用程序对一个ODBC管理器(ODBCM),这反过来加载相应的驱动程序并传递函数调用的调用。功能名称冲突在共享对象

假设我的驱动程序被编译到共享对象中,它暴露了两个函数AB
什么是应该发生的是ODBCM是调用函数A,和功能A是调用函数B
什么是实际发生的是,当函数A调用函数B代替函数B'(其具有相同的名称作为B,位于libodbc共享对象,并通过使用Linux应用ODBC加载)被调用。

我觉得自己好像应该是编译时间标志,或后编译库修改工具,将解决此问题。
目前我经历的库中的一个函数在同一时间执行以下操作:

_B(){ // rename old functions 
    ... 
} 
B() { // add new wrapper function 
    return _B(); // which just calls old 
} 

_A() { 
    ... 
    _B(); // Change calls to renamed functions 
    ... 
} 

这是缓慢的改变,感觉缺憾。

回答

6

尝试链接您的.so-Bsymbolic链接器选项(在gcc命令行上通过-Wl,-Bsymbolic)。这会在链接时绑定所有库内部的符号,以便以后不会进行任何动态链接。

+0

这解决了问题!谢谢,为我节省了大量的时间手动重命名函数和编写包装。 – TheGeneral 2011-01-28 19:15:41