Связывание статических библиотек: -llibrary или liblibrary.a?

Я действительно запутался здесь, вот что я думаю, это упрощенная модель моей ситуации:

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, а также много флагов. Или дело в том, что я упускаю что-то еще, может быть, какое-то ключевое различие между командами? Я могу опубликовать точные команды, которые работают и не работают, если это необходимо.


person Ayberk Özgür    schedule 17.09.2014    source источник


Ответы (1)


Вам нужно указать компоновщику связать все файлы архива:

gcc -shared dummy.cpp.o -o libOutput.so -L/path/to/libs -Wl,-whole-archive -lMyLibrary1.a -lMyLibrary2.a -Wl,-no-whole-archive

Поскольку у статических библиотек нет зависимостей, вам нужно указать компоновщику создать новую статическую библиотеку, содержащую оба набора объектов.

Ваш второй случай (который отлично работает) дает желаемый эффект, потому что вы передаете статическую библиотеку непосредственно своему компилятору.

В первом случае компоновщик возьмет объекты из библиотеки1 и библиотеки2, на которые ссылается фиктивный объект.

person Jens Luedicke    schedule 17.09.2014
comment
Нет такого флага в обеих командах, одна из которых работает нормально. - person Ayberk Özgür; 17.09.2014
comment
Я вижу, это имеет смысл. Это также согласуется с этим: stackoverflow.com/questions/9952146/. Итак, в конце концов, есть разница между передачей -lMyLib и libMyLib.a, если есть зависимости от других связанных библиотек. - person Ayberk Özgür; 18.09.2014