Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
gcc -Wl,--as-needed ...
gcc -Wl,--as-needed ...
Я в 1-й раз столкнулся с проблемой ... и описана она здесь - Mint.
Собираем простейшую программу ... сложности порядка Hello World! - файл ex1.c
И надеемся, что уж с такой то программой мы справимся...
Ага ... ща-а-а-аз:
Но стоит поменять местами опции gcc - и всё срабатывает:
И ещё одна особенность - если то же собирать как приложение C++:
Это не зависит а). ни от версии gcc, б). ни от разрядности системы...
А зависит это ... от используемого дистрибутива Linux!
Это не возникает в: Fedora, CentOS, Debian ... и даже Rosa и Mag.
Это возникает в: Ubuntu (со всеми их разнообразными Xubuntu, Lubuntu, Kubuntu...), Mint, Gentoo, ALT Linux.
Не знаю, каким ещё дистрибутивам это свойственно.
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ lsb_release -ircd
Distributor ID: LinuxMint
Description: Linux Mint 17.1 Rebecca
Release: 17.1
Codename: rebecca
Код: Выделить всё
#include <stdio.h>
#include <math.h>
int main( void ) {
float d = 9;
printf( "%f\n", sqrt( d ) );
return 0;
}
Ага ... ща-а-а-аз:
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ gcc -Wall -lm ex1.c -o ex1
/tmp/ccUuI8Fy.o: In function `main':
ex1.c:(.text+0x1a): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ gcc -Wall ex1.c -lm -o ex1
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ ./ex1
3.000000
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ g++ -lm -Wall ex1.c -o ex1++
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ ./ex1++
3.000000
А зависит это ... от используемого дистрибутива Linux!
Это не возникает в: Fedora, CentOS, Debian ... и даже Rosa и Mag.
Это возникает в: Ubuntu (со всеми их разнообразными Xubuntu, Lubuntu, Kubuntu...), Mint, Gentoo, ALT Linux.
Не знаю, каким ещё дистрибутивам это свойственно.
Последний раз редактировалось Olej 19 авг 2016, 11:48, всего редактировалось 1 раз.
Re: gcc -Wl,--as-needed ...
Проблема, в общем, известная.Olej писал(а):Я в 1-й раз столкнулся с проблемой ...
Интернет полнится криками: "Help!".
Но в ... организованной литературе (книги, статьи, ...) я никогда не встречал даже упоминания проблемы.
Но если с ней столкнуться и быть неготовым ... много крови может попить!
Особенно когда это сборка чужого проекта с готовым и объёмным Makrfile (или ./configure), подготовленным в другой системе.
И уж не говоря про сборку с помощью CMake (вдруг кому такая глупость взбредёт), которую в таких случаях, предполагаю, или просто невозможно корректно описать в CMakeLists.txt, или очень искусственно нужно изощряться ... и долго.
Происхождение, природа проблемы мне известна.
И её преодоление ... на 50-70% случаев - известны.
Но она тянет за собой ряд вопросов:
- как точно определить (предполагать) что в вашем проекте (в вашей системе) это может выявиться?
- как её устранить ... в тех случаях, которые не подпадают под вот те 50-70% случаев?
Re: gcc -Wl,--as-needed ...
Может я че то не допоняла. Надо математическую библиотеку подключать
Код: Выделить всё
gcc -lm
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: gcc -Wl,--as-needed ...
Математическая библиотека там подключена (посмотрите командные строки выше).nezabudka писал(а):Может я че то не допоняла. Надо математическую библиотеку подключатьКод: Выделить всё
gcc -lm
Разговор вот о чём:
- во многих дистрибутивах Linux, но не во всех...
- сборка пакета gcc выполняется так, что используемые библиотеки в командной строке должны указываться после указания объектных файлов, которые их исользуют
- например:
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ gcc -Wall ex1.c -lm -o ex1
А вот это даёт ошибку:
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ gcc -Wall -lm ex1.c -o ex1
/tmp/ccDl3g6B.o: In function `main':
ex1.c:(.text+0x1a): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Такое поведение не требует загрузки этих библиотек при исполнении и даёт экономию ... как показали более поздние исследования порядка 4.5%
Но в погоне за рыночной привлекательностью (вот мы якобы лучше других ) некоторые стали собирать GCC именно так.
В связи с этим в GCC и появилась новая опция (линковщика) -Wl,--as-needed (которая вынесена в заголовок): не подключать библиотеки, на которые нет ссылок из объектных файлов.
Об этом достаточно много обсуждений ... и стонов в Интернет (стонов, главным образом, от тех кто не знает и не понимает что за опция -Wl,--as-needed).
P.S. Да и с самой опцией -Wl,--as-needed стоило бы поразбираться ... во всех дистрибутивах Linux.
Последний раз редактировалось Olej 19 авг 2016, 13:22, всего редактировалось 3 раза.
Re: gcc -Wl,--as-needed ...
Olej, А у меня на федоре 23 по всякому получается. Щас попробую на дебе тестинг. Извиняюсь, пропустила пару строчек из темы. Все стало на свои места. Я завязала с убунтой и даже проверить не где
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: gcc -Wl,--as-needed ...
Я перечислил вначале те дистрибутивы, из которых знаю, где эта вещь проявляется, и те где нет.nezabudka писал(а): Olej, А у меня на федоре 23 по всякому получается. Щас попробую на дебе тестинг. Извиняюсь, пропустила пару строчек из темы. Все стало на свои места. Я завязала с убунтой и даже проверить не где
Fedora как раз из числа тех, где этого эффекта нет.
Но эта штука вылазит при переносимости!
Элементарный проект, перенесенный из одного Linux в другой, может оказаться там не собираемым. Поэтому такую штуку надо знать.
И я, пока, не знаю, по какому критерию (какой командой) определить: будет это проявляться в нём или нет.
Re: gcc -Wl,--as-needed ...
А проверять такие вещи (и другие, связанные с переносимостью) нужно на виртуальных машинах.nezabudka писал(а): Все стало на свои места. Я завязала с убунтой и даже проверить не где
Которых у меня, к примеру, десятка полтора
Очень рекомендую!
P.S. И лучше всего, для этих целей (!!!), использовать VirtualBox, из-за простоты работы с ним и обновлений версий: VirtualBox (ресурсы и возможности).
Re: gcc -Wl,--as-needed ...
Значит на убунтоподобных дистрах можно найти в ман странице gcc опцию --as-needed а в других дистрах ПОКА нет
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: gcc -Wl,--as-needed ...
Olej Да у меня столько же вируальных гостей но нет среди них убунты. Раньше держала на флешке в качестве скорой помощи но в последнее время или я от убунты отдалилась или она пошла лесом
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: gcc -Wl,--as-needed ...
Хорошо опция запоминается "если нужно" теперь уж точно не забуду
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay