Ich bin dabei, CPU-Versand basierend auf Prozessor-Features zu verwenden, um die Implementierung eines komplizierten numerischen Algorithmus zu wechseln. Ich möchte die beiden Versionen (eine Version von sse2 und sse3 aus Gründen des Arguments) einbeziehen. Ich kompiliere in derselben dynamischen Bibliothek.Vermeidung von doppeltem Symbol beim Kompilieren mit mehreren Befehlssätzen
Der bisherige Ansatz besteht darin, den gesamten architekturspezifischen Code in einen Namespace einzubetten, z. namespace sse2
und namespace sse3
und vermeiden damit doppelte Symbolnamen beim Verknüpfen mit der endgültigen dynamischen Bibliothek.
Was passiert jedoch, wenn ich einen Code außerhalb meiner Kontrolle (z. B. eine std::vector<int>
) in der sse2 und ss3-Version verwenden. Soweit ich sehen kann, wird die std::vector
Implementierung in den Objektdateien sse2 und sse3 vorhanden sein, könnte aber theoretisch je nach den Optimierungen, die vom Compiler ausgeführt werden, unterschiedliche Anweisungen enthalten. Wenn ich diese Objektdateien in die dynamische Bibliothek einbinde, wird eine davon verwendet, und ich riskiere möglicherweise, eine sse3-Anweisung auf einer CPU auszuführen, die nur sse2 unterstützt.
Abgesehen von der Kompilierung in zwei separate dynamische Bibliotheken, was kann getan werden, um dieses Problem zu umgehen? Ich brauche eine Lösung, die sowohl mit Visual Studio als auch mit Windows, Mac OS X und Linux funktioniert.
'std :: vector' wird entweder in einer dynamischen Bibliothek oder einer statischen Bibliothek implementiert, die mit Ihrem eigenen Objekt verknüpft ist (z. B. in glibc). Ihre Objektdateien sollten nur die Deklaration von 'std :: vector' und nicht die Implementierung/Definition enthalten. Was ist das Problem? –
Zunächst war std :: vector nur ein Beispiel. Ich spreche auch über andere Bibliotheken von Drittanbietern, die nur Header sein können. Zweitens ist std :: vector eine Vorlage, so dass der Code in meinen eigenen Objektdateien vorhanden ist. –
[Das könnte Sie interessieren] (https://stackoverflow.com/questions/30320369/aliass-of-a-function-template). Wenn Sie eine Bibliothek aus einer Headerdatei verwenden, stellen Sie sicher, dass alle Funktionen statisch inline sind. Das ist, was ich tue. –