【发布时间】:2015-08-10 23:43:30
【问题描述】:
我正在使用基于处理器特性的 CPU 调度来切换复杂数值算法的实现。我想包含我在同一个动态库中编译的两个版本(一个 sse2 和 sse3 版本)。
目前采用的方法是将所有架构特定的代码包装到一个命名空间中,例如namespace sse2 和 namespace sse3 从而避免在链接到最终动态库时出现重复的符号名称。
但是,如果我在 sse2 和 ss3 版本中都使用了一些我无法控制的代码(例如 std::vector<int>),会发生什么情况。据我所知,std::vector 实现将出现在 sse2 和 sse3 目标文件中,但理论上可能包含不同的指令,具体取决于编译器执行的优化。当我将这些目标文件链接到动态库时,将使用其中一个,我可能会尝试在仅支持 sse2 的 cpu 上运行 sse3 指令。
除了编译成两个独立的动态库之外,还可以做些什么来解决这个问题?我需要在 windows、mac os x 和 linux 上同时使用 Visual Studio 和 clang 的解决方案。
【问题讨论】:
-
std::vector将在链接到您自己的对象的动态库或静态库中实现(例如在 glibc 中)。您的目标文件应该只包含std::vector的声明而不是实现/定义。有什么问题? -
首先,std::vector 只是一个例子。我也在谈论其他只能作为标题的第三方库。其次,std::vector 是一个模板,因此代码将出现在我自己的目标文件中。
-
This may interest you。如果您使用头文件中的库,请确保所有函数都是静态内联的。我就是这么做的。
-
如果我被允许编辑第三方标题,那将起作用。或者我可以将它们包装在匿名命名空间等中。但是,这不是一个选项。