在Linux上使用来自纯C项目的C ++编写的库?

时间:2011-09-30 11:30:27

标签: c++ c windows linux shared-libraries

发现此声明over at PSE :(引用Bob

  

我在Windows和Mac OS上最喜欢的技巧之一不适用于Linux。   这个技巧是使用C ++内部编写DLL / dylib,导出C   API,然后能够从C程序调用它。 Linux共享   对象(DLL的本地等价物)不能真正做到这一点,   因为C ++标准库.so不在默认搜索路径中。   如果你没有为你的C程序做一些奇怪的事情,它将失败   一旦它在运行时动态加载你的.so:你的.so会尝试   动态加载标准库.so,它将找不到它,并且   那么你的程序就会退出。

我发现有点奇怪。这有多准确,考虑到Linux的主要桌面/服务器发行版之间可能存在差异?

这纯粹是出于好奇,因为我目前只进行Windows(C ++)编程。


至于Windows,我不得不做一些查找,我会把它放在这里供参考: 对于C std库,C ++可执行文件通常会链接到MSVCR*.DLL,对于驻留在此DLL中的STL,它们会链接到MSVCP*.DLL。这两个都驻留在system32目录中,或者,对于显示的东西,它们将驻留在Windows SideBySide缓存的子目录中( winsxs文件夹)。

1 个答案:

答案 0 :(得分:4)

我一直在做这件事,而且工作正常。我很确定那个人有一个完全不相关的问题,并指责它的库搜索路径。

我从未见过libstdc++.so路径不在/usr/lib[64]/的任何Linux发行版。

这也让我想知道C ++程序通常如何为那个人工作,因为据我所知,.so文件的搜索路径与语言无关。

也许他总是使用特殊版本并使用-rpath链接器选项编译所有程序?但即便如此,只要在他的C程序中添加该选项也会起作用。

  

它会在运行时动态加载你的.so时失败:你的   .so将尝试动态加载标准库。所以,它不会   找到它,然后你的程序就会退出。

这让我想知道他是否仅指你自己使用dlopen() .so。但是它也可以正常工作,除非你没有将.so链接到你的libstdc++.so(这将是你自己的错;如果你依赖于任何其他库,那将是同样的问题,无论如何它写的是什么语言。)