Страница 1 из 2

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

Добавлено: 18 авг 2016, 16:30
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.
Не знаю, каким ещё дистрибутивам это свойственно.

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

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

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

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

Но она тянет за собой ряд вопросов:
- как точно определить (предполагать) что в вашем проекте (в вашей системе) это может выявиться?
- как её устранить ... в тех случаях, которые не подпадают под вот те 50-70% случаев?

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

Добавлено: 19 авг 2016, 12:53
nezabudka
Может я че то не допоняла. Надо математическую библиотеку подключать

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

Добавлено: 19 авг 2016, 13:02
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.

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

Добавлено: 19 авг 2016, 13:05
nezabudka
Olej, А у меня на федоре 23 по всякому получается. Щас попробую на дебе тестинг. Извиняюсь, пропустила пару строчек из темы. Все стало на свои места. Я завязала с убунтой и даже проверить не где :)

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

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

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

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

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

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

P.S. И лучше всего, для этих целей (!!!), использовать VirtualBox, из-за простоты работы с ним и обновлений версий: VirtualBox (ресурсы и возможности).

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

Добавлено: 19 авг 2016, 13:20
nezabudka
Значит на убунтоподобных дистрах можно найти в ман странице gcc опцию --as-needed а в других дистрах ПОКА нет

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

Добавлено: 19 авг 2016, 13:23
nezabudka
Olej Да у меня столько же вируальных гостей но нет среди них убунты. Раньше держала на флешке в качестве скорой помощи но в последнее время или я от убунты отдалилась или она пошла лесом :)

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

Добавлено: 19 авг 2016, 13:25
nezabudka
Хорошо опция запоминается "если нужно" теперь уж точно не забуду