Как я могу скомпилировать мое приложение, связывающее статически библиотеку glibc, но только код, необходимый для моего приложения? (Не все lib)
Теперь моя команда компиляции:
g++ -o newserver test.cpp ... -lboost_system -lboost_thread -std=c++0x
Спасибо!
Это то что -static
делает (как описано в другом ответе): ненужные модули не будут связаны с вашей программой. Но ваши ожидания от количества вещей, которые необходимый (в том смысле, что мы не можем убедить компоновщика в обратном) может быть слишком оптимистичным.
Если вы пытаетесь сделать это для переносимости (запуск исполняемого файла на других машинах с более старым glibc или чем-то в этом роде), есть один простой тестовый вопрос, чтобы увидеть, получите ли вы то, что хотите:
Вы думали о проблеме с libnss
, а ты уверен, что тебя это не укусит?
Если ваш ответ да, может быть, имеет смысл продолжать. Если ответ «нет» или вопрос кажется слишком неясным и ответа нет, просто прекратите свое истечение срока действия с помощью статически связанного glibc: у него больше шансов навредить, чем помочь.
добавлять -static
к строке компиляции. Он будет только добавлять то, что нужно вашему приложению [и, конечно, любые функции, которые вызываются из приложения, и любые функции, которые эти функции вызывают, включая кучу кода запуска и некоторые другие фрагменты], так что это будет около 800 КБ (для простая программа «hello world») на компьютере с архитектурой x86. Другие архитектуры различаются. Так как boost, вероятно, также немного вызовет стандартную библиотеку, вероятно, к вашему приложению будет добавлено более 800 КБ. Но он применяет только функции, используемые любым кодом в конечном двоичном файле, а не всей библиотекой (около 2 МБ в качестве общей библиотеки).
Если вам нужна ТОЛЬКО ссылка glibc, вам нужно изменить строку компоновки для вашей компиляции, чтобы:
-Wl,-Bstatic -libc -Wl,-Bdynamic
, Это предотвратит статическое связывание любой другой библиотеки [иногда вам нужно иметь более одного из этих операторов, так как иногда что-то, извлеченное другой библиотекой, требует извлечения «большего» из glibc — не волнуйтесь, это победило » не может принести ничего, кроме того, что линкер считает необходимым].