Скачал http://aluigi.altervista.org/papers/unxwb.zip, пытаюсь собрать. Там основной файл unxwb.c и 4 *.h файла, подключаемые в начале:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <zlib.h>
#include <stdint.h>
#include "show_dump.h"
#include "myxact.h"
#include "mywav.h"
#include "xma_header.h"
В этих заголовочных файлах — определения типов и структур и функции, вызываемые из unxwb.c. Не заголовки, а именно функции.
1. При запуске «gcc unxwb.c» получаю серию ошибок линковки вида:
unxwb.c:(.text+0xb74): undefined reference to `xma_le16'
unxwb.c:(.text+0xb8a): undefined reference to `xma_le32'
inline unsigned xma_le16(unsigned n) {
...
}
inline unsigned xma_le32(unsigned n) {
...
}
В чём дело, почему не видит эти функции?
Дополнение: Нашлась более новая версия: http://blog.ssokolow.com/archives/2014/04/21/extracting-music-from-xwb-files-... Из её мейкфайла выяснил, что с ключом -O2 нормально собирается и работает. То же с -O1, -O3, -Ofast, -Og и -Os. По умолчанию -O0 — с ним не работают. Что такого делают -O1, -O2, -O3, -Ofast, -Og и -Os, что начинает линковаться правильно?
2. Кроме того, на:
fprintf(fdinfo, "\n"
"- bank name %.*s\n"
sizeof(wavebankdata.szBankName), wavebankdata.szBankName);
nxwb.c:470:25: warning: field precision specifier ‘.*’ expects argument of type ‘int’, but argument 5 has type ‘long unsigned int’ [-Wformat=]
fprintf(fdinfo, "\n"
^
Не вызваны ли ошибки линковки тем же?
Дополнение: -O2 и другие -O... на это не влияют.
Полный вывод «gcc -v unxwb.c -lz»: https://pastebin.com/bd0zY68f (Почти все системные заголовочные файлы и библиотеки нормально подставляются параметрами по умолчанию, явно нужно указывать только -lz для zlib.)
Ответ: При сборке без оптимизаций (-O0) функции с атрибутом inline не подключаются. «By design.» Любого из -O1, -O2, -O3, -Ofast, -Og или -Os достаточно.
«gcc -O2 unxwb.c -lz» нормально собирает программу, и она работает.