К сожалению, не существует универсального подхода, который будет работать во всех случаях.
В хорошо -обслуживаемых библиотеках soname служит в качестве базового уровня ABI, т. е. индикатора обратной совместимости. Для изображения SDL вы можете получить это, используяreadelf
:
$ readelf -d /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so | grep SONAME
0x000000000000000e (SONAME) Library soname: [libSDL2_image-2.0.so.0]
Тем не менее, это не дает вам версию патча; насколько я могу судить, единственный способ определить это — вызвать функцию IMG_Linked_Version
в библиотеке:
#include <stdio.h>
#include <SDL2/SDL_image.h>
int main(int argc, char **argv) {
const SDL_version *version = IMG_Linked_Version();
printf("Running with SDL_image version %d.%d.%d\n",
version->major, version->minor, version->patch);
return 0;
}
Соберите это с помощью-lSDL2_image
(и заголовков SDL ), затем запустите его, чтобы найти версию:
Running with SDL_image version 2.0.4
Некоторые библиотеки определяют символы версий, которые вы также можете использовать, хотя опять же они не обязательно включают информацию об исправлениях; например, для библиотеки GNU C:
$ nm -D /lib/x86_64-linux-gnu/libc-2.28.so | awk '/GLIBC_/ { print $3 }' | sort -V
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE
$ awk -F'[,]' '{sum=0; for (i=2; i<=NF; i++) sum+=$i; print ($1=="ADD" ? 1 : -1) * sum}' file
35
-55
Если вам нужно было поддерживать больше операций, чем просто ADD и SUB, например.:
$ cat file
ADD 5,10,20
SUB 30,5,20
MULT 2,3,4
DIV 20,2,2
вы можете использовать GNU awk и определять функции для каждой операции, которую вы хотите поддерживать, и вызывать их косвенно:
$ cat tst.awk
function ADD(n) { sum += n }
function SUB(n) { sum -= n }
function DIV(n) { if (n==0) { printf "%s[%d]: Divide by zero error in %s\n", FILENAME, FNR, $0 | "cat>&2"; exit 1 } sum /= n }
function MULT(n) { sum *= n }
BEGIN { FS="[,]" }
{
op = $1
sum = (op=="SUB" ? -1 : 1) * $2
for (i=3; i<=NF; i++) {
@op($i)
}
print sum
}
$ awk -f tst.awk file
35
-55
24
5
Мне пришлось использовать специальный -случай «SUB», чтобы получить желаемый результат из ввода, который вы предоставили для этого, поскольку он обрабатывается иначе, чем остальные (, т.е. все числа вычитаются из нуля, а не все числа добавляются/ умножаются/делятся друг на друга ). Если бы первое число в строке SUB было -30
или 0
вместо 30
, тогда все операции могли бы обрабатываться точно так же, например.:
$ cat file
ADD 5,10,20
SUB 0,30,5,20
MULT 2,3,4
DIV 20,2,2
$ cat tst.awk
function ADD(n) { sum += n }
function SUB(n) { sum -= n }
function DIV(n) { if (n==0) { printf "%s[%d]: Divide by zero error in %s\n", FILENAME, FNR, $0 | "cat>&2"; exit 1 } sum /= n }
function MULT(n) { sum *= n }
BEGIN { FS="[,]" }
{
op = $1
sum = $2
for (i=3; i<=NF; i++) {
@op($i)
}
print sum
}
$ awk -f tst.awk file
35
-55
24
5