Skip to content

Set CXX_VISIBILITY_PRESET to "default" for AppleClang #56

@j-o

Description

@j-o

AppleClang (and clang?) handles RTTI for template instantiations a little different than MSVC and GCC:
With visibility "hidden", a template instantiation in library A is a different type than the exact same template instantiation in library B that links against A. That means, that dynamic_casts between those types fail with AppleClang, but not with MSVC or GCC. With visibility "default", it works.

An example is the gloperate::Loader<T>. During component registration, e.g., gloperate::Loader<Texture> is instantiated within the gloperate-qt-loaders plugin (soon to be gloperate-qt). Loader objects created by the ResourceManager have this type. When an application then calls ResourceManager::load<Texture>, gloperate::Loader<Texture> is instantiated again within the application. As both are different types according to AppleClangs RTTI, the dynamic_cast used to find a loader of the correct type always fails.

A "clean" solution might be to explicitly export all those template instantiations; however, (I think) @scheibel and I both tried it and could not get it to work. Until someone actually manages that, I propose to set the cmake CXX_VISIBILITY_PRESET to "default" for AppleClang, as this is a very subtle bug that is hard to find.

Does anybody know, whether this affects clang as well?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions