Макросы препроцессора в статической библиотеке - PullRequest
4 голосов
/ 17 октября 2011

В проекте Objective-C я использую статическую библиотеку, компиляция этой статической библиотеки зависит от некоторых макросов препроцессора, которые нужно установить.

Когда я устанавливаю эти макросы в проекте в зависимости от библиотеки библиотекине видит их.Но когда я устанавливаю их в проекте библиотеки, это работает.

Поскольку я хочу повторно использовать эту библиотеку для других проектов, мне необходимо установить макросы препроцессора для каждого проекта в зависимости от библиотеки отдельно.Есть ли решение для этого?

Ответы [ 2 ]

7 голосов
/ 17 октября 2011

Maros препроцессора имеют какое-либо значение только во время компиляции, поэтому любая библиотека, которую вы создаете, будет зависеть от значений этих макросов препроцессора во время создания библиотеки.Вам потребуется либо множество разных версий вашей библиотеки, построенных с различными возможными значениями макросов препроцессора, либо вы можете переключиться на использование другого метода для управления поведением кода вашей библиотеки, который будет работать во время выполнения, например, настройканекоторые подходящие параметры через API библиотеки.

1 голос
/ 20 марта 2014

Это не ответ сам по себе, но кое-что интересное я обнаружил, борясь с этой же проблемой.

У меня есть статическая библиотека (MyLib), которая содержит заголовок для ведения журнала (Log.h).У меня есть проект приложения (MyApp), который использует MyLib.Log.h имеет некоторое сходство с этим:

#ifdef LOG_LEVEL_DEBUG
#   define LogDebug(...) NSLog(__VA_ARGS__)
#else 
#   define LogDebug(...)
#endif

В MyApp настройках сборки я могу использовать макрос препроцессора LOG_LEVEL_DEBUG, чтобы успешно выключить и включить ведение журнала.Это работает, когда я использую LogDebug() в исходных файлах, найденных в MyApp.Однако исходные файлы MyLib, использующие LogDebug(), не затрагиваются настройками сборки MyApp.Я должен использовать настройки сборки MyLib, чтобы повлиять на LogDebug() в исходных файлах MyLib.

Я почти уверен, что знаю, что происходит, но я был бы готов к исправлению.Ниже приведен сценарий, в котором MyApp определяет LOG_LEVEL_DEBUG в настройках сборки (включение отладки), а MyLib не определяет его (отключение).

При сборке MyApp сначала компилируется MyLibгде все LogDebug() заменены в исходных файлах MyLib как no-op (так как LOG_LEVEL_DEBUG не было определено).После компиляции MyLib компилируется MyApp, и все методы LogDebug() в MyApp source заменяются операторами NSLog(), поскольку LOG_LEVEL_DEBUG было определено в настройках сборки.

...