Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов.
8(977)608-78-62 adm@nixm.ru

gcc -Wl,--as-needed ...

Olej

gcc -Wl,--as-needed ...

Сообщение Olej »

Я в 1-й раз столкнулся с проблемой ... и описана она здесь - Mint.

Код: Выделить всё

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
Собираем простейшую программу ... сложности порядка Hello World! - файл ex1.c

Код: Выделить всё

#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
Но стоит поменять местами опции gcc - и всё срабатывает:

Код: Выделить всё

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
И ещё одна особенность - если то же собирать как приложение C++:

Код: Выделить всё

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
Это не зависит а). ни от версии gcc, б). ни от разрядности системы...
А зависит это ... от используемого дистрибутива Linux! :-o
Это не возникает в: Fedora, CentOS, Debian ... и даже Rosa и Mag.
Это возникает в: Ubuntu (со всеми их разнообразными Xubuntu, Lubuntu, Kubuntu...), Mint, Gentoo, ALT Linux.
Не знаю, каким ещё дистрибутивам это свойственно.
Последний раз редактировалось Olej 19 авг 2016, 11:48, всего редактировалось 1 раз.
Olej

Re: gcc -Wl,--as-needed ...

Сообщение Olej »

Olej писал(а):Я в 1-й раз столкнулся с проблемой ...
Проблема, в общем, известная.
Интернет полнится криками: "Help!". :cry: :evil:
Но в ... организованной литературе (книги, статьи, ...) я никогда не встречал даже упоминания проблемы.

Но если с ней столкнуться и быть неготовым ... много крови может попить! :(
Особенно когда это сборка чужого проекта с готовым и объёмным Makrfile (или ./configure), подготовленным в другой системе.
И уж не говоря про сборку с помощью CMake (вдруг кому такая глупость взбредёт), которую в таких случаях, предполагаю, или просто невозможно корректно описать в CMakeLists.txt, или очень искусственно нужно изощряться ... и долго. :cry:

Происхождение, природа проблемы мне известна.
И её преодоление ... на 50-70% случаев - известны.

Но она тянет за собой ряд вопросов:
- как точно определить (предполагать) что в вашем проекте (в вашей системе) это может выявиться?
- как её устранить ... в тех случаях, которые не подпадают под вот те 50-70% случаев?
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: gcc -Wl,--as-needed ...

Сообщение nezabudka »

Может я че то не допоняла. Надо математическую библиотеку подключать
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Olej

Re: gcc -Wl,--as-needed ...

Сообщение Olej »

nezabudka писал(а):Может я че то не допоняла. Надо математическую библиотеку подключать
Математическая библиотека там подключена (посмотрите командные строки выше).

Разговор вот о чём:

- во многих дистрибутивах 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
Это делается для того, чтобы (якобы) не подключались библиотеки DLL, которые указаны в командной строке, но на которые нет ссылок из объектных файлов. (А указание исходных файлов .c только маскирует ситуацию - после их компиляции на их месте окажутся объектные - и делает сообщения об ошибках ещё более загадочными для тех, кто не знает и не предполагает здесь подвоха).
Такое поведение не требует загрузки этих библиотек при исполнении и даёт экономию ... как показали более поздние исследования порядка 4.5% :?
Но в погоне за рыночной привлекательностью (вот мы якобы лучше других :lol: ) некоторые стали собирать GCC именно так.

В связи с этим в GCC и появилась новая опция (линковщика) -Wl,--as-needed (которая вынесена в заголовок): не подключать библиотеки, на которые нет ссылок из объектных файлов.
Об этом достаточно много обсуждений ... и стонов в Интернет (стонов, главным образом, от тех кто не знает и не понимает что за опция -Wl,--as-needed).

P.S. Да и с самой опцией -Wl,--as-needed стоило бы поразбираться ... во всех дистрибутивах Linux.
Последний раз редактировалось Olej 19 авг 2016, 13:22, всего редактировалось 3 раза.
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: gcc -Wl,--as-needed ...

Сообщение nezabudka »

Olej, А у меня на федоре 23 по всякому получается. Щас попробую на дебе тестинг. Извиняюсь, пропустила пару строчек из темы. Все стало на свои места. Я завязала с убунтой и даже проверить не где :)
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Olej

Re: gcc -Wl,--as-needed ...

Сообщение Olej »

nezabudka писал(а): Olej, А у меня на федоре 23 по всякому получается. Щас попробую на дебе тестинг. Извиняюсь, пропустила пару строчек из темы. Все стало на свои места. Я завязала с убунтой и даже проверить не где :)
Я перечислил вначале те дистрибутивы, из которых знаю, где эта вещь проявляется, и те где нет.
Fedora как раз из числа тех, где этого эффекта нет.

Но эта штука вылазит при переносимости!
Элементарный проект, перенесенный из одного Linux в другой, может оказаться там не собираемым. Поэтому такую штуку надо знать.

И я, пока, не знаю, по какому критерию (какой командой) определить: будет это проявляться в нём или нет.
Olej

Re: gcc -Wl,--as-needed ...

Сообщение Olej »

nezabudka писал(а): Все стало на свои места. Я завязала с убунтой и даже проверить не где :)
А проверять такие вещи (и другие, связанные с переносимостью) нужно на виртуальных машинах.
Которых у меня, к примеру, десятка полтора :D
Очень рекомендую!

P.S. И лучше всего, для этих целей (!!!), использовать VirtualBox, из-за простоты работы с ним и обновлений версий: VirtualBox (ресурсы и возможности).
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: gcc -Wl,--as-needed ...

Сообщение nezabudka »

Значит на убунтоподобных дистрах можно найти в ман странице gcc опцию --as-needed а в других дистрах ПОКА нет
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: gcc -Wl,--as-needed ...

Сообщение nezabudka »

Olej Да у меня столько же вируальных гостей но нет среди них убунты. Раньше держала на флешке в качестве скорой помощи но в последнее время или я от убунты отдалилась или она пошла лесом :)
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: gcc -Wl,--as-needed ...

Сообщение nezabudka »

Хорошо опция запоминается "если нужно" теперь уж точно не забуду
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Ответить

Вернуться в «C/C++»