2012-07-06 89 views
0

我正在开发一个程序,它生成某些部分作为c/C++库。 例如它会创建目录 - lib1,lib2,..,libN。 对于每个库,它生成c/C++代码+ Makefile,然后使用gcc/g ++ + ld,最后它调用库中的代码。 现在的问题是,如果lib1具有函数fun和libN,那么当从libN调用fun时,将使用lib1。 我已经尝试不同版本的gcc/g ++到v4.7。gcc/g ++/ld缓存?

回答

3

现在的问题是,如果lib1有一个函数fun和libN,当从libN调用fun时,会使用lib1。

想必你正在谈论共享库,而不是归档库(在那里你会得到一个多重定义的符号错误)。

是的,这是它应该如何工作的,并且总是有在UNIX上工作。缓存有什么也没有与它做。

如果你在ELF平台上,你也许能使其利用-Wl,-Bsymbolic工作更类似于Windows,但你会战斗系统默认的行为,应该期望坎坷不平,和许多意想不到的疑难杂症的的。如果fun不需要从libX公开,隐藏symbol visibility是你的朋友。

由于您正在生成lib1,... libN的代码,因此可能更容易避免使用例如名称冲突。 libX_fun而不是fun。这也会更便携,因为它只会在任何地方工作。

更新:

函数名具有真正根据接口规范是有趣的。

根据谁的接口规格?

你显然控制了主程序和库。所以你可以,而且可能应该改变接口规范来避免这个问题。

+0

根据接口规范,函数名称真的很有趣。 – nil 2012-07-08 10:04:47

+0

'-Wl,-Bsymbolic'没有帮助。但是,我在libX完成工作后立即使用'dlclose'解决了这个问题。如果我想同时使用'lib1',','libN',这将不起作用。 – nil 2012-07-08 10:10:48

+0

有一个预编译的调用'fun'的MATLAB代码,在运行时重新编译它会代价太大。 – nil 2012-07-09 00:00:25