Как cmake add_library определяет видимость символов? - PullRequest
0 голосов
/ 01 июня 2018

Я создаю общую библиотеку с помощью команды CMake add_library следующим образом:

add_library(mylibname OPTION SHARED SOURCES ${source_files} HEADERS ${header_files})

Когда я проверяю эту библиотеку с помощью «nm», я обнаруживаю, что некоторые символы помечены как глобально видимые («T»)и другие видны только внутри библиотеки («t»).У меня вопрос, почему?От чего зависит видимость символа, когда я ничего не сделал для его управления?

Я спрашиваю, потому что так получилось, что когда я связываю эту библиотеку с другой частью проекта, я получаю неопределенные ссылочные ошибки иэто потому, что символы, которые мне нужны, по некоторым причинам видны только внутри библиотеки.Так что я хочу как-то изменить букву "t" на букву "T", но, поскольку я не знаю, почему она вообще является буквой "t", я полагаю, что сначала я бы хотел узнать это :).

Рассматриваемый символ является специализацией функции шаблона, так что, возможно, видимость по умолчанию имеет отношение к шаблонам или что-то в этом роде?

1 Ответ

0 голосов
/ 03 июня 2018

Видимость символа контролируется для каждой цели с помощью свойств цели <LANG>_VISIBILITY_PRESET и VISIBILITY_INLINES_HIDDEN.Значения по умолчанию для них взяты из переменных CMAKE_<LANG>_VISIBILITY_PRESET и CMAKE_VISIBILITY_INLINES_HIDDEN соответственно.Если эти две переменные были установлены, это может объяснить, каким образом символы, которые вы ожидаете экспортировать, каким-то образом становятся внутренними.

Обратите внимание, что хотя символы экспортируются по умолчанию с некоторыми компиляторами (например, GCC, clang),в Windows с Visual Studio они не экспортируются по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...