我正在使用基于处理器特性的 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 的解决方案。
最佳答案
一种方法是在共享库级别而不是目标文件级别进行调度。这将需要使用不同的指令集支持多次编译整个库,然后根据您检测到的 CPU 功能在运行时分派(dispatch)到适当的共享库。我详细介绍了一种适用于 OS X 和 Linux 的方法 in this previous answer .不过,我还没有尝试在 Windows 上实现这一点。
关于c++ - 编译为多个指令集时避免重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30507020/