发现此声明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文件夹)。
答案 0 :(得分:4)
我一直在做这件事,而且工作正常。我很确定那个人有一个完全不相关的问题,并指责它的库搜索路径。
我从未见过libstdc++.so
路径不在/usr/lib[64]/
的任何Linux发行版。
这也让我想知道C ++程序通常如何为那个人工作,因为据我所知,.so
文件的搜索路径与语言无关。
也许他总是使用特殊版本并使用-rpath
链接器选项编译所有程序?但即便如此,只要在他的C程序中添加该选项也会起作用。
它会在运行时动态加载你的.so时失败:你的 .so将尝试动态加载标准库。所以,它不会 找到它,然后你的程序就会退出。
这让我想知道他是否仅指你自己使用dlopen()
.so
。但是它也可以正常工作,除非你没有将.so
链接到你的libstdc++.so
(这将是你自己的错;如果你依赖于任何其他库,那将是同样的问题,无论如何它写的是什么语言。)