Jestem w trakcie korzystania z wysyłania procesora w oparciu o funkcje procesora, aby przełączyć implementację skomplikowanego algorytmu numerycznego. Chcę dołączyć dwie wersje (wersję sse2 i sse3 dla argumentów) Kompiluję w tej samej dynamicznej bibliotece.Unikanie powtarzania symbolu podczas kompilowania do wielu zestawów instrukcji
Dotychczasowe podejście polegało na zawarciu całego kodu architektury do przestrzeni nazw, np. namespace sse2
i namespace sse3
i tym samym unika się powielania nazw symboli podczas łączenia z ostateczną biblioteką dynamiczną.
Co jednak się stanie, jeśli użyję kodu spoza mojej kontroli (np. std::vector<int>
) zarówno w wersji sse2, jak i ss3. O ile widzę, implementacja std::vector
będzie obecna zarówno w plikach obiektów sse2, jak i sse3, ale teoretycznie może zawierać różne instrukcje w zależności od optymalizacji wykonywanych przez kompilator. Kiedy połączę te pliki obiektów z biblioteką dynamiczną, jedna z nich zostanie wykorzystana i ryzykuję potencjalnie próbą uruchomienia instrukcji sse3 na procesorze obsługującym tylko sse2.
Oprócz kompilacji do dwóch oddzielnych bibliotek dynamicznych, co można zrobić, aby obejść ten problem? Potrzebuję rozwiązania działającego zarówno w Visual Studio, jak i klangu w systemie Windows, Mac OS X i Linux.
'std :: vector' zostanie zaimplementowany w bibliotece dynamicznej lub bibliotece statycznej połączonej z twoim obiektem (np. W glibc). Twoje pliki obiektowe powinny zawierać tylko deklarację 'std :: vector', a nie implementację/definicję. Jaki jest problem? –
Po pierwsze, std :: vector był tylko przykładem. Mówię także o innych bibliotekach stron trzecich, które mogą być tylko nagłówkami. Po drugie, std :: vector jest szablonem, więc kod będzie obecny w moich własnych plikach obiektowych. –
[To może Cię zainteresować] (https://stackoverflow.com/questions/30320369/alias-of-a-function-template). Jeśli używasz biblioteki z pliku nagłówkowego, upewnij się, że wszystkie funkcje są wbudowane statycznie. To jest to co robię. –