Как я могу создать макрос для получения имени библиотеки, в которую компилируется класс? - PullRequest
0 голосов
/ 08 октября 2009

Как я могу создать макрос для получения имени библиотеки, в которую компилируется класс? Есть ли какой-нибудь способ получить эту информацию от make?

По сути, я хотел бы сделать что-то вроде:

  #  define LIBRARY_NAME (get info from make maybe?)
  ...
  #  ifdef LIBRARY_NAME
        static const char* s_lib_name = STRINGIZE(LIBRARY_NAME);

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 октября 2009

g++ позволяет использовать -DMACRO_NAME=MACRO_VALUE для предоставления значений макросов в командной строке. Предположительно, другие компиляторы имеют аналогичные функции.

Это эквивалентно наличию

#define MACRO_NAME MACRO_VALUE 

вверху каждого обрабатываемого файла.

Оставление части =MACRO_VALUE эквивалентно простой #define MACRO_NAME.

Так что теперь все, что вам нужно сделать, это получить make, чтобы отслеживать конечный пункт назначения для каждого файла, который вы компилируете (что может быть или не быть тривиальным, зависит от того, что вы делаете ...) .


Вы также можете взглянуть на операторы # stringization и ## tokenization в препроцессоре c . Они могут сэкономить вам немного работы здесь ...

0 голосов
/ 08 октября 2009

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

Существует предопределенный макрос __FILE__, который разрешает имя файла компилируемого источника. Но я не уверен, как это поможет вам. Это сообщит вам исходный файл (и неявно объектный файл), но не библиотеку.

Возможно, это можно сделать для библиотек DLL или разделяемых библиотек, поскольку они загружаются во время выполнения, поэтому имя файла библиотеки должно быть неявно известно во время выполнения.

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