Можно ли идентифицировать библиотеку, соответствующую определенным файлам заголовков?
Предположим, что у нас есть несколько файлов заголовков и библиотек в том же каталоге. Если я не знаю, с какой библиотекой я должен ссылаться, могу ли я программно определить, какая библиотека должна использоваться.
Предположим, я попытался скомпилировать свой код, и компоновщик жаловался на нерешенные внешние символы. Есть ли что-нибудь, что я могу сделать, зная, что правильная библиотека существует в том же каталоге?
Ответы
Ответ 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, выводятся неглобальные функции (так, те, которые не обязательно должны быть включены в файлы заголовков).