Есть две разные проблемы, первая из которых самая простая, вы использовали неправильные параметры компилятора.Опция -L указывает компоновщику также искать в каталоге при поиске библиотеки.-L говорит ему, чтобы связать определенную библиотеку.Для связи вы должны использовать:
g ++ -o test test.o -L / path / to -lcovis
или
g ++ -o test test.o -l / path / to / libcovis.a
Для принудительного статического связывания, если одна и та же библиотека присутствует как динамическая библиотека в том же каталоге.
Вторая потенциальная проблема заключается в том, что порядок статических библиотек в командной строке компоновщика имеет значение, поэтому это также может быть проблемой, если есть зависимость от разных статических библиотек.
g ++ -o test tests.o -ldependent -lprovider
Компоновщик будет обрабатывать библиотеки в том порядке, в котором они находятся в командной строке, и из каждой статической библиотеки.он будет извлекать только те символы, которые требуются (с таким количеством информации, какое есть у компоновщика на тот момент).В приведенной выше командной строке компоновщик извлечет из dependent
символов, которые ему необходимы для test.o
, и это, в свою очередь, может добавить новые неопределенные символы в программу (зависимости dependent
).Когда он обрабатывает provider
, он заполняет эти символы.Если порядок был изменен в командной строке, символы, требуемые dependent
, но не test.o
, не будут добавлены в исполняемый файл, так как компоновщик не знает, что эти символы понадобятся при обработке provider
.