Можно ли идентифицировать библиотеку, соответствующую определенным файлам заголовков?

Предположим, что у нас есть несколько файлов заголовков и библиотек в том же каталоге. Если я не знаю, с какой библиотекой я должен ссылаться, могу ли я программно определить, какая библиотека должна использоваться.

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

Ответы

Ответ 1

Я думаю, что ответ на этот вопрос может вам очень помочь: Инструменты для проверки .lib файлов?.

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

Ответ 2

"Могу ли я программно определить, какая библиотека должна использоваться".

Не внутри одной и той же программы /codebase . "Программная" (скажем, template трюки и т.д.) Способность сохраняется до стадии компиляции. Как только связь начнется (по состоянию на сегодняшний день), управление исчезнет.

"Я могу что-нибудь сделать, зная, что правильная библиотека существует в том же каталоге?"

Опять Нет. Я не собираюсь демотивировать вас, но то, что вы просите, в любом случае не будет полезным. Предположим, каким-то образом вам удастся найти способ узнать, существует ли библиотека в том же каталоге. Какую цель он будет выполнять? Потому что практически библиотека может находиться в любом пути. Нужно просто установить переменные пути в опции MSVC или -L в gcc. Поэтому вопрос о наличии библиотеки в том же каталоге является спорным.

Возможно, вы захотите спросить, как узнать, существует ли библиотека в вашей системе и где.
Ну, это, конечно, невозможно программно в той же кодовой базе. Потому что вам нужно запустить эту кодовую базу, чтобы найти, существует ли библиотека где-то в вашей системе. Чтобы запустить эту кодовую базу, вы должны ее связать. Проблема с куриным яйцом.
Либо вы проверите вручную, либо напишите свой собственный отдельный script/code, чтобы выполнить эту задачу.

Ответ 3

Может быть, лучше использовать dll Функция GetProcAddress в С++ или если вы сами пишете lib, вы можете добавить код в заголовок следующим образом: '#' pragma comment (lib, "libname.lib" ) надеяться на его помощь

Ответ 4

Недавно я изучал больше С++, и у меня был аналогичный вопрос. Большинство библиотек и заголовков, по крайней мере, имеют сходное имя, но различия между "libm" и "math.h" действительно заставляют меня задаваться вопросом, как более систематически определять это.

Для статических и динамических библиотек инструмент, который мне нашел полезным, readelf, и мне нравится эта команда:

readelf --symbols <elf_file> | sed -ne '/FUNC/p'

Итак, для моего мотивирующего примера:

$ readelf --symbols /lib/libm.so.5 | sed -ne '/FUNC/p'
     2: 0000000000000000   476 FUNC    WEAK   DEFAULT  UND [email protected]_1.0 (8)
     4: 0000000000000000    62 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
     5: 0000000000000000   310 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
     6: 0000000000000000    41 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
     9: 0000000000000000     8 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
    11: 0000000000000000    16 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
    12: 0000000000000000    53 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
    14: 0000000000000000    84 FUNC    GLOBAL DEFAULT  UND [email protected]_1.0 (8)
    16: 0000000000004ed0     6 FUNC    GLOBAL DEFAULT   12 [email protected]@FBSD_1.0
    17: 0000000000019930   405 FUNC    GLOBAL DEFAULT   12 [email protected]@FBSD_1.3
    18: 0000000000016590   600 FUNC    GLOBAL DEFAULT   12 [email protected]@FBSD_1.0
  ...

Эта команда также работает для архивных файлов ar, таких как libcurl.a.

Итак, здесь вы можете увидеть функции, определенные в библиотеке. Оттуда я визуально сравнил имена в последнем столбце типа "log10l" с именами в файле заголовка /usr/include/math.h и нашел высокое соответствие. Мне представляется целесообразным написать программу, основанную на этом. Разбор последнего столбца команды readelf выше и сделайте grep для всех .h файлов в /usr/include. Однако я этого не делал.

После некоторых экспериментов, связанных с моим ответом, я обнаружил, что команда sed, возможно, будет немного усовершенствована для ваших нужд. Когда я использовал readelf на libcurl.a, выводятся неглобальные функции (так, те, которые не обязательно должны быть включены в файлы заголовков).