我正在使用基于处理器功能的CPU调度来切换复杂数字算法的实现。我想包括两个版本(出于参数考虑,分别为sse2和sse3版本),我正在同一动态库中进行编译。
迄今为止采取的方法是将所有特定于体系结构的代码包装到 namespace 中,例如namespace sse2
和namespace sse3
,因此在链接到最终动态库时避免了重复的符号名称。
但是,如果我在sse2和ss3版本中都使用了一些无法控制的代码(例如std::vector<int>
),将会发生什么情况。据我所知,std::vector
实现将同时出现在sse2和sse3目标文件中,但理论上可以包含不同的指令,具体取决于编译器执行的优化。当我将这些目标文件链接到动态库时,将使用其中的一个,并且冒着可能尝试在仅支持sse2的cpu上运行sse3指令的风险。
除了编译为两个单独的动态库之外,还可以采取什么措施来解决此问题?我需要在Windows,Mac OS X和Linux上都可以使用Visual Studio和clang的解决方案。
最佳答案
一种方法是在共享库级别而不是在对象文件级别进行分派(dispatch)。这将需要使用不同的指令集支持多次编译整个库,然后根据您检测到的CPU功能在运行时将其分发到适当的共享库。我详细介绍了一种可以在OS X和Linux上in this previous answer上使用的方法。但是,我尚未尝试在Windows上实现此功能。
关于c++ - 编译为多个指令集时避免重复符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30507020/