怎么才能解决两个不同的库文件中有相同的名称函数链接冲突的问题

先原谅自己 2007-09-12 06:50:07
问题是这样的,由别人提供的两个库文件(无法获得源码)实现类似但不同的功能,现在想把它们都加入到程序中来。他们有些函数是重名的,现在还想调用不同库中的函数名称相同的函数实现不同的功能,这样可能么?
我搜了一下有人说namespace的东西,我没看太懂怎么回事,但似乎是行不通,我们用的是c语言也拿不到源代码。
...全文
3951 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhtjg 2007-09-22
  • 打赏
  • 举报
回复
动态加载应该能解决这个问题把,当然重新包个库一个可以
_石头_ 2007-09-22
  • 打赏
  • 举报
回复 2
把与两个库相关的头文件改一下,分别针对两个库中同名的函数增加一个宏(也可以定义一个带参数的宏,其参数就是一个指向函数的指针),然后再自己的程序里,采用定义后的宏来调用相应的函数.
ivy1023 2007-09-22
  • 打赏
  • 举报
回复
从如下角度考虑:
1.如果库是别人的,而且有名字空间,那是最好,直接用名字空间加要调用的函数名:
如 ivy::my_function();
其中ivy是名字空间的名字。
2.考虑动态库的显示加载:
可以查这几个库函数:
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module
);
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);
其中第二个函数的第一个参数就是第一个函数的返回值。
SammyLan 2007-09-22
  • 打赏
  • 举报
回复
假设你那两个库是C.lib和CPP.lib,假设C.lib和CPP.lib中有N个同名的符号,解决方法如下
1.对于有冲突的N 个符号:新建一个CProxy和CPPProxy DLL项目,前者重新重新包装C.lib中的那N个函数(如函数名后加_c后缀),后者重新包装CPP.lib中的那N个函数(如函数名后加_cpp后缀).项目中如果用到对应的符号,就要加载对应的Proxy lib,同时加载也没关系
2.对于没有冲突的符号,可以在项目中直接使用(对于没有用到的符号,即使有冲突,只要不连接到这些符号,应该是没问题的,我不敢确定,楼主可以试一下)

仅供参考
cceczjxy 2007-09-22
  • 打赏
  • 举报
回复
动态加载,还个函数名就可以了
  • 打赏
  • 举报
回复
要用动态库
b.c + d.c >>W.dll
c.c + e.c >>X.dll

这样就好了
extern int fun1_fromeB(void);
extern int fun1_fromeC(void);
//main.c
int main(void)
{

printf("fun1_fromeC:%d\n",fun1_fromeC());
printf("fun1_fromeB:%d\n",fun1_fromeB());
return 1;
}
先原谅自己 2007-09-21
  • 打赏
  • 举报
回复
iu_81(黄云万里动风色,白波九道流雪山。)
把他们的库自己在封装成两个库,区别开名字既可
akirya(坏[其实偶不是什么所谓的坏人]) (
重新包装一个库,将相应的函数名字改变一下.


我在vc下试了一下

//b.c
int fun1(void)
{
printf("b.c\n");
return 1;
}
//c.c
int fun1(void)
{
printf("b.c\n");
return 1;
}

//d.c
extern int fun1(void);

int fun1_fromeB(void)
{

return fun1();
}
//e.c
extern int fun1(void);

int fun1_fromeC(void)
{

return fun1();
}

b.c + d.c >>w.lib
c.c + e.c >>w.lib


extern int fun1_fromeB(void);
extern int fun1_fromeC(void);
//main.c
int main(void)
{

printf("fun1_fromeC:%d\n",fun1_fromeC());
printf("fun1_fromeB:%d\n",fun1_fromeB());
return 1;
}

我得到的结果达不到目的且很随机。需要在生成库是加入什么特殊的选项么?我还在尝试



我是苦力 2007-09-17
  • 打赏
  • 举报
回复
这个帖子,牛人多,学习了
whw123456 2007-09-17
  • 打赏
  • 举报
回复
学习··
WinWing 2007-09-15
  • 打赏
  • 举报
回复
只能是自己重新封装一下了
或者直接修改库文件,不过貌似比较麻烦 :-)
ckt 2007-09-15
  • 打赏
  • 举报
回复
自己修改下库吧,

如果每次调用一个函数都要去获得一个地址,
对于少量函数调用还好。
如果库中有很多个函数,不是显得太繁琐了。
atlcat 2007-09-15
  • 打赏
  • 举报
回复
建议不要在编译的时候加入库,不管是在环境变量设置中引入.lib还是import .lib
我会使用函数指针来加载并执行库函数
typedef (*FUN)(...);//你的函数格式
FUN funProc;
HMODLE hDll=NULL;
char *DLL1Path=DLL1的路径;
char *DLL2Path=DLL2的路径;
if(需要使用DLL1)
hDll=LoadLibary(DLL1Path);
else
hDll=LoadLibary(DLL2Path);
if(hDll)
funProc=GetFunctionProc(函数名);//抱歉,这个GetFunctionProc函数忘了怎么拼写了,手头没有装开发环境,你查一下msdn

然后执行funProc就可以了
lddLinan 2007-09-15
  • 打赏
  • 举报
回复
封装库采用静态连接是没用的,由方法可以把外部连接强制转化为内部连接么?
expter 2007-09-12
  • 打赏
  • 举报
回复
up
wotur 2007-09-12
  • 打赏
  • 举报
回复
akirya(坏[其实偶不是什么所谓的坏人]) ( ) 高,
受教了
iu_81 2007-09-12
  • 打赏
  • 举报
回复
把他们的库自己在封装成两个库,区别开名字既可
lddLinan 2007-09-12
  • 打赏
  • 举报
回复

写三个程序,一个主程序调度其它两个,另外两个程序分别使用两个库,主程序开始后开启两个线程调度其它两个程序...有点小题大做了,还是dll比较方便一些。

把那两个库的作者托出去打
  • 打赏
  • 举报
回复
重新包装一个库,将相应的函数名字改变一下.
Yofoo 2007-09-12
  • 打赏
  • 举报
回复
别人提供的两个库文件 如果有相同的符号名, 用Lib编译肯定是通不过的,
使用动态加载dll方式, getprocaddress 可以解决这个问题

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧