C++中的插件系统很难,因为ABI没有正确定义,每个编译器(或其版本)都遵循自己的规则.但是,Windows上的COM表明,可以创建一个最小的插件系统,允许具有不同编译器的程序员使用简单的界面为主机应用程序创建插件.
让我们变得实用,并且在这方面保留C++标准,除了一分钟之外.如果我想为支持C++插件的Windows和Mac(以及可选的Linux)编写应用程序,并且我想为插件作者提供相当多的编译器选择(比如说不到2年的Visual C++版本) ,GCC或英特尔的C++编译器),我可以依靠C++的哪些特性?
当然,我认为插件是针对特定平台编写的.
在我的脑海中,这里有一些我能想到的C++特性,我认为答案是:
我很感激您在该领域的任何经验,您可以分享.如果您知道任何具有C++插件系统的中等成功应用程序,那也很酷.
卡尔
如果您真的经历过与上述标题相关的事情,您是否介意留下您对此的评论?我试图让一个共享对象在Ubuntu上延迟加载Clang和GCC(我实际上不介意使用哪个编译器),但它们看起来并不支持任何延迟加载功能(我期望延迟加载功能)在一个父对象中放置一个存根,该对象试图在需要功能的时刻根据需要加载另一个对象,但实际上并没有这样做.以下命令显示我试图使libbar.so延迟加载到libfoo.so:
clang bar.c -fPIC -shared -o libbar.so
clang foo.c -Wl,-zlazy,lL'/path/to/where/lib/is',-lbar -o foo
Run Code Online (Sandbox Code Playgroud)
如果libbar.so不存在,您将看到libfoo.so在进入条目之前引发异常.无论如何,我不介意上面的命令中是否有任何拼写错误,但是想知道Clang/GCC是否真的支持延迟加载功能.
但就个人而言,如果Clang/GCC不支持任何延迟加载功能,我无法相信Linux程序开发人员是否需要调用dlopen()或dlsym()来使共享对象延迟加载.如果对象是用C语言编写的,那可能没问题,但如果它是用C++编写的,情况必须完全复杂:(
我相信在编译器或链接器的帮助下实现的解决方案是最好的,因为我已经成功地使用Windows和Mac OS.所以我觉得,即使在Clang/GCC上,公民也希望梦想拥有延迟加载功能,这将是一种自然的反应.如果你对我的感受有任何评论,我也会很感激.
PS.我知道Solaris支持延迟加载功能,但这不适合我,因为我不会在其上开发任何东西.
无论如何,非常感谢你提前.