Wpis z mikrobloga

Cześć,

Mam program, który posiada część real-time i non-real-time. Używam systemu czasu rzeczywistego Xenomai (pod #linux). Sam Xenomai ma wrappery dołączane linkerem, które nadpisują wszystkie klasyczne funkcje linuxowe. Mój program składa się z wielu bibliotek z czego jedna powinna mieć owrappowane funkcje. Niestety dołączenie flag linkera dla tej biblioteki powoduje owrappowanie funkcji całego projektu. Co robię źle, że nie zostaje to rozdzielone?

CMake dla tej biblioteki: https://pastebin.com/qsFwmBgV
Część CMake projektu - dołączenie biblioteki: https://pastebin.com/n0XvkE3B

#programowanie #cmake #cpp #programista15k #kompilacja
  • 8
@MamCieNaHita: Czy posiadając binarkę z wrapperami (bez headera) mogę to jakość obejść? Myślałem o nazwaniu docelowo wrappowanych fukcji tak jak są w tej binarce, ale nie zrobię tego chyba bezpośrednio w kodzie nie mając headera, prawda?
@MamCieNaHita: Możesz możesz, wtedy linker wybierze pierwszy napotkany symbol. Część kompilatorów domyślne wyrzuca warning (albo error?) w takim wypadku, ale zazwyczaj mają opcję żeby to ignorować.

@Parseval Jeśli te wrappery statycznie linkujesz z całym twoim projektem, to wydaje mi się, że nie ma możliwości żeby to obejść. Ewentualnie możesz spróbować pokombinować z wrapperami - możesz zadeklarować w bibliotece wrappera jakąś globalną flagę (definiowaną z zewnątrz, extern) decydującą czy to co ma
@rejestracjaniedziala: ładowanie linkerowi dwóch różnych funkcji o tej samej sygnaturze skutkuje złamaniem zasady One Definition Rule, i kompilator ma pełną dowolność w wyborze implementacji i mogą się dziać rzeczy niestworzone. w C normalnie nie mogą się duplikować implementacje, ale w C++ może dojść do instancjonowania dwóch takich samych instancji szablonu dwóch różnych jednostkach translacji i trzeba je skleić w jedną, i to najlepiej szybko - czyli brana jest dowolna bez sprawdzania
@MamCieNaHita: Dobra uwaga. Z tym, że GNU runtime linker ma ściśle określone, którego symbolu użyje. One zawsze będą miały kolejność taką, w jakiej zostały załadowane i zawsze zawoła ten pierwszy. Jest to zdefiniowane i napisane w dokumentacji. Nie wiem jak to wygląda w innych linkerach. To co do pomysłu z dynamiczną biblioteką.

Co do statycznej kompilacji to nie bez znaczenia jest tu fakt, że op nadpisuje funkcję systemową. W takiej sytuacji