Я действительно запутался здесь, вот что я считаю упрощенной моделью моей ситуации:
libMyLibrary2.a
имеет ссылки на libMyLibrary1.a
, Если я ссылку, как это:
gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -lMyLibrary1 -lMyLibrary2
Я получаю целую кучу undefined reference to
ошибки. Но если я буду ссылаться так:
gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -lMyLibrary1 /path/to/libs/libMyLibrary2.a
Все в порядке. Это нормально? Или это как-то связано с моими конкретными настройками? На самом деле у меня есть множество библиотек вместо MyLibrary1 и MyLibrary2, а также много флагов. Или это тот случай, когда я что-то упускаю, может быть, какая-то ключевая разница между командами? Я могу опубликовать точные команды, которые работают и не работают, если требуется.
Вы должны указать компоновщику, чтобы он связывал целые архивные файлы:
gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -Wl,-whole-archive -lMyLibrary1.a -lMyLibrary2.a -Wl,-no-whole-archive
Поскольку у статических библиотек нет зависимостей, необходимо указать компоновщику создать новую статическую библиотеку, которая содержит оба набора объектов.
Ваш второй случай (который работает нормально) дает желаемый эффект, потому что вы передаете статическую библиотеку непосредственно вашему компилятору.
В первом случае компоновщик будет брать объекты из library1 и library2, на которые ссылается фиктивный объект.