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;
}
Не важно, что делает этот код, важно что это нужно связать с библиотекой libpcre.so :
Код: Выделить всё
[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
В 1-м случае всё собирается. Во 2-м случае та же сборка - ошибка.
Более того, это Fedora 23, где по умолчанию этот эффект не возникает, но опция -Wl,--as-needed его
выявляет... при использовании стандартного компоновщика ld.bfd .
Так что не стоит обольщаться, что C++ вас спасёт.
