Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
gcc -Wl,--as-needed ...
Re: gcc -Wl,--as-needed ...
Опция -Wl,--as-needed есть во всех дистрибутивах.nezabudka писал(а):Значит на убунтоподобных дистрах можно найти в ман странице gcc опцию --as-needed а в других дистрах ПОКА нет
Это опция самого GCC.
И может быть полезной, если нею умело распорядиться.
Опция и вот этот эффект, связанный с жёстким порядком указания библиотек в командной строке - это разные вещи.
Хотя у них и общая природа: желание исключить из сборки не используемые библиотеки.
Re: gcc -Wl,--as-needed ...
Нет Ubuntu, так, может, есть Mint, или ALT Linux...nezabudka писал(а):Да у меня столько же вируальных гостей но нет среди них убунты.
В том-то и фокус, что довольно много дистрибутивов где это проявляется.
Или может проявиться в следующей ... или предыдущей версии.
И вы, со своим проектом, на неё нарвётесь.
Re: gcc -Wl,--as-needed ...
Обычно пользуюсь флагом в makefile LDFLAGS думаю make должен разруливать все правильно.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 ...
Это не так.nezabudka писал(а):Обычно пользуюсь флагом в makefile LDFLAGS думаю make должен разруливать все правильно.Olej писал(а):..И вы, со своим проектом, на неё нарвётесь.
LDFLAGS - это только перечень используемых библиотек. Если вы натолкаете туда, вместо требуемых 2-х библиотек, 22, то все 22 DLL будут автозагружаться при выполнении вашего проекта (ну, скажем, не полностью загружаться, а загружаться их таблицы имён ... или что-то подобное в этом случае ... не хочется вспоминать и разбираться).
Об этом достаточно много пишут в обсуждениях. И в этом действительно есть проблема.
P.S. А make - вообще ни в чём не "разбирается" - это не его проблема, make вообще к программированию не имеет отношения - это программа тупо управления обновлениями файлов на их временных зависимостях ... вы можете на make построить себе, например, ... дневник выполнения намеченных дел
Re: gcc -Wl,--as-needed ...
Откуда у меня возникло по-новой разбирательство с этой проблемой?nezabudka писал(а):думаю make должен разруливать все правильно.Olej писал(а):..И вы, со своим проектом, на неё нарвётесь.
Меня попросили проект с Makefile (который я раньше и сделал) переписать под сборку CMake.
И вот, у меня на Fedora проект собирается, а у клиента на Ubuntu - ни фига ... с тяжелейшими и не диагностируемыми ошибками.
В итоге, полагаю, под некоторыми дистрибутивами проекты на языке C с помощью CMake вообще невозможно будет собрать (гипотеза ).
Потому как параметры сборки там в CMakeLists.txt вы определяете спец. макросами типа:
Код: Выделить всё
execute_process(COMMAND net-snmp-config --agent-libs
OUTPUT_VARIABLE LDOPT
)
string(STRIP "${LDOPT}" CMAKE_EXE_LINKER_FLAGS)
И так со всем великим множеством переменных CMake.
P.S. Резюме ... попутно возникшее (и сформулированное мной заказчику ): а не надо пользоваться всякими приблудами для сборки , типа CMake (и QtCreator) ... или всякими "проектами", которые строят некоторые разные IDE - это всё идёт от дурных манер Windows и MS VisualStudio. А нужно пользоваться Makefile.
Re: gcc -Wl,--as-needed ...
Вот объяснение того, откуда ноги растут: ld и --as-needednezabudka писал(а):Обычно пользуюсь флагом в makefile LDFLAGS думаю make должен разруливать все правильно.
И до сих пор единого мнения нет.2008-06-01 23:48:28
Re: gcc -Wl,--as-needed ...
Есть очень интересное решение проблемы в тех дистрибутивах, где этот эффект наблюдается, и тогда, когда он мешает:
Обсуждаемый эффект наблюдается.
А теперь смотрим сюда:
Как легко видеть, это два разных компоновщика.
Сменили компоновщик ld.bfd на ld.gold.
Теперь всё срабатывает без проблем.
Код: Выделить всё
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
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 / $ ls -l `which ld`*
lrwxrwxrwx 1 root root 6 мая 2 23:41 /usr/bin/ld -> ld.bfd
-rwxr-xr-x 1 root root 1042556 мая 2 23:40 /usr/bin/ld.bfd
-rwxr-xr-x 1 root root 5424 мая 26 13:39 /usr/bin/ldd
-rwxr-xr-x 1 root root 2513280 мая 2 23:40 /usr/bin/ld.gold
-rwxr-xr-x 1 root root 87 февр. 16 2014 /usr/bin/ld-musl-config
olej@nvidia / $ ld.bfd --version
GNU ld (GNU Binutils for Ubuntu) 2.24
Copyright 2013 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
olej@nvidia / $ ld.gold --version
GNU gold (GNU Binutils for Ubuntu 2.24) 1.11
Copyright 2013 Free Software Foundation, Inc.
Данная программа является свободным программным обеспечением; вы можете распространять её в соответствии
с условиями GNU General Public License Версия 3 или (на ваш выбор) более поздней версии.
Эта программа не имеет абсолютно никаких гарантий.
Как легко видеть, это два разных компоновщика.
Код: Выделить всё
olej@nvidia /usr/bin $ sudo ln -sf /usr/bin/ld.gold /usr/bin/ld
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ gcc -Wall -lm ex1.c -o ex1
Теперь всё срабатывает без проблем.
Re: gcc -Wl,--as-needed ...
А вот тут я вас обманул ... необоснованно обнадёжил.Olej писал(а): И ещё одна особенность - если то же собирать как приложение C++:Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/as-needed $ g++ -lm -Wall ex1.c -o ex1++
С C++ в точности такая же картина.
Просто потому, что к команде линковки g++ по умолчанию добавляет -lstdc++ с зависимостями (включая -lm), и делает это в конце командной строки, эффект неразрешённой ссылки маскируется.
Код: Выделить всё
#include <iostream>
#include <cstring>
#include <pcre.h>
int main(int argc, char **argv) {
pcre *re;
const char *err;
int erroffset;
if (argc != 3) {
std::cerr << "specify exactly 2 arguments" << std::endl;
return 1;
}
re = pcre_compile(argv[1], 0, &err, &erroffset, nullptr);
if (! re) {
std::cerr << erroffset << ": " << err << std::endl;
return 2;
}
if (pcre_exec(re, nullptr, argv[2], strlen(argv[2]), 0, 0, nullptr, 0) != PCRE_ERROR_NOMATCH) {
std::cout << argv[2] << std::endl;
}
return 0;
}
Код: Выделить всё
[olej@dell as-needed]$ g++ -std=gnu++11 -Wl,--as-needed -o ex2 ex2.cc -lpcre
[olej@dell as-needed]$ g++ -std=gnu++11 -Wl,--as-needed -lpcre -o ex2 ex2.cc
/tmp/cc02ATVb.o: In function `main':
ex2.cc:(.text+0x5e): undefined reference to `pcre_compile'
ex2.cc:(.text+0xe9): undefined reference to `pcre_exec'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
Более того, это Fedora 23, где по умолчанию этот эффект не возникает, но опция -Wl,--as-needed его выявляет... при использовании стандартного компоновщика ld.bfd .
Так что не стоит обольщаться, что C++ вас спасёт.
Re: gcc -Wl,--as-needed ...
Так что проблема стала абсолютно понятна, прозрачна, и ясны пути её преодоления, когда она проявится.