2016-09-01 9 views
0

Я компилирую проект qt5 C++ с компиляцией gnu49 при соединении с несколькими другими dylib (armadillo, boost libs и т. Д.).) на Mac OSX El Captitan с флагом C++ 11 и обычными флагами флага qt. Проект компилируется отлично, но чтобы сделать его более переносимым на нескольких других машинах, я пытаюсь статически связать несколько динамических библиотек. Я добавил -статический флаг перед библиотекой (для статической привязки) (например, -static -lboost_thread), как описано здесь.Статическая связь с dylib ld: библиотека не найдена для -lcrt0.o collect2: error: ld возвращен 1 статус выхода

https://gcc.gnu.org/ml/gcc/2000-05/msg00517.html

Однако, я получаю следующее сообщение об ошибке.

ld: library not found for -lcrt0.o collect2: error: ld returned 1 exit status

Я проверял, что ошибка возникает только при попытке связывать статически, а не с динамическим связыванием.

ответ

1

GCC's -static option, который вы применяете, не является позиционным. Он обеспечивает статическую привязку всех библиотек. то Ваша связь не удается, потому что ваша система не имеет статической версии libcrt0.o

Вы можете быть запутанным static вариант GCC с ld's -static option (синонимы: -Bstatic, -dn-non_shared), который является позиционной. Это влияет только на последующие библиотеки на командной строке. Это инверсия опции linker -Bdynamic (синонимы: -dy, -call_shared).

Так связать только библиотеки -lfoo, -lbar ... статически, с помощью GCC, вы можете пройти через -Bstatic к линкер непосредственно перед упоминаете их и -Bdynamic сразу после них:

-Wl,-Bstatic -lfoo -lbar -Wl,-Bdynamic 

Не опускаем окончательный -Wl,-Bdynamic, даже если -lbar является последней из ваших библиотек, потому что GCC тихо добавляет стандартные библиотеки к вашей ссылке (как вы уже нашли).

+0

спасибо за продуманный ответ – Pal