Re: порядок аргументов gcc
On 04/09/2020 14:17, Stanislav Maslovski wrote: On Fri, Sep 04, 2020 at 01:40:43PM +0300, Anatoly Pugachev wrote: On Fri, Sep 4, 2020 at 1:12 PM sergio wrote: Забавно, но это не у одного меня так: https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc И вот тут еще, про --as-needed в секции "Importance of linking order" https://wiki.gentoo.org/wiki/Project:Quality_Assurance/As-needed Так, ОК, но я всё равно не понял, почему у Анатолия на той же версии всё работает, где этот --as-needed подсовывается? -- sergio.
Re: порядок аргументов gcc
On 04/09/2020 14:27, Stanislav Maslovski wrote: Попробуй сделать gcc --verbose usbtest.c -lusb и gcc --verbose -lusb usbtest.c и сравни вывод. одинаковый, за исключением названий файлов и порядка -lusb % diff a b 12c12 < /usr/lib/gcc/x86_64-linux-gnu/10/cc1 -quiet -v -imultiarch x86_64-linux-gnu usbtest.c -quiet -dumpbase usbtest.c -mtune=generic -march=x86-64 -auxbase usbtest -version -fasynchronous-unwind-tables -o /tmp/cckRKCS2.s --- > /usr/lib/gcc/x86_64-linux-gnu/10/cc1 -quiet -v -imultiarch x86_64-linux-gnu usbtest.c -quiet -dumpbase usbtest.c -mtune=generic -march=x86-64 -auxbase usbtest -version -fasynchronous-unwind-tables -o /tmp/ccXYg8d9.s 35c35 < as -v --64 -o /tmp/ccpmsdG2.o /tmp/cckRKCS2.s --- > as -v --64 -o /tmp/cc1hEI67.o /tmp/ccXYg8d9.s 40,41c40,43 < /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgVq9u2.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/10 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. /tmp/ccpmsdG2.o -lusb -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o < COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64' --- > /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper -plugin-opt=-fresolution=/tmp/ccblo7B9.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/10 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. -lusb /tmp/cc1hEI67.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o > /usr/bin/ld: /tmp/cc1hEI67.o: in function `main': > usbtest.c:(.text+0x5): undefined reference to `usb_init' > collect2: error: ld returned 1 exit status zsh: exit 1 diff a b -- sergio.
Re: порядок аргументов gcc
On Fri, 4 Sep 2020, Stanislav Maslovski wrote: On Fri, Sep 04, 2020 at 12:36:15PM +0300, sergio wrote: On 04/09/2020 12:26, Stanislav Maslovski wrote: gcc --version gcc (Debian 10.2.0-6) 10.2.0 Это Sid Попробуй сделать gcc --verbose usbtest.c -lusb и gcc --verbose -lusb usbtest.c и сравни вывод. -- Stanislav Хорошая идея! :) Вывод простой, во всем виновата опция "--as-needed" которую теперь при линковке использует по умолчанию gcc. gcc-10 -Wl,--no-as-needed -lm math.c собирает нормально. Опытным путем нашел, что такое поведение начинается с gcc-9. gcc-8 работает без --as-needed. Ю.
Re: порядок аргументов gcc
On Fri, Sep 04, 2020 at 12:36:15PM +0300, sergio wrote: > On 04/09/2020 12:26, Stanislav Maslovski wrote: > > gcc --version > > gcc (Debian 10.2.0-6) 10.2.0 > > Это Sid Попробуй сделать gcc --verbose usbtest.c -lusb и gcc --verbose -lusb usbtest.c и сравни вывод. -- Stanislav
Re: порядок аргументов gcc
On Fri, Sep 04, 2020 at 01:40:43PM +0300, Anatoly Pugachev wrote: > On Fri, Sep 4, 2020 at 1:12 PM sergio wrote: > > Забавно, но это не у одного меня так: > > https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc И вот тут еще, про --as-needed в секции "Importance of linking order" https://wiki.gentoo.org/wiki/Project:Quality_Assurance/As-needed -- Stanislav
Re: порядок аргументов gcc
On Fri, Sep 4, 2020 at 1:12 PM sergio wrote: > > > % gcc -lusb usbtest.c > /usr/bin/ld: /tmp/cckKmWxL.o: in function `main': > usbtest.c:(.text+0x5): undefined reference to `usb_init' > collect2: error: ld returned 1 exit status > zsh: exit 1 gcc -lusb usbtest.c > % gcc usbtest.c -lusb > % > > Забавно, но это не у одного меня так: https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc
Re: порядок аргументов gcc
On Fri, 4 Sep 2020, sergio wrote: gcc -lusb file.c раньше работало, а теперь ругается на undefined reference и надо говорить gcc file.c -lusb Что произошло и что поменялось? -- sergio. "undefined reference" это ругается компоновщик (linker). В принципе, для компоновщика всегда было правило, что неопределенные функции ищутся в библиотеках слева направо. То есть, если стоит -lu1 -lu2, то неопределенные символы в u2 не ищутся в u1. В случае с компилируемыми файлами, раньше они всегда переставлялись в крайнюю левую позицию до библиотек и поэтому работало. > gcc -dumpversion 4.8.5 > gcc -lm math.c OK Теперь, видимо, решили унифицировать: > gcc -dumpversion 10 > LANG=C gcc -lm math.c undefined reference Кленг пока еще работает по старому. > clang -dumpversion 9.0.1 > clang -lm math.c OK Вот с какой версии gcc это началось, самому интересно, найду, напишу. Ю. p.s. "math.c" #include #include int main() { double x = 3.5; printf(" %.1f %.1f\n",x,-x); printf("ceil %.1f %.1f\n",ceil(x),ceil(-x)); printf("floor %.1f %.1f\n",floor(x),floor(-x)); printf("round %.1f %.1f\n",round(x),round(-x)); printf("trunc %.1f %.1f\n",trunc(x),trunc(-x)); printf("nearbyint %.1f %.1f\n",nearbyint(x),nearbyint(-x)); return 0; }
Re: порядок аргументов gcc
% gcc -lusb usbtest.c /usr/bin/ld: /tmp/cckKmWxL.o: in function `main': usbtest.c:(.text+0x5): undefined reference to `usb_init' collect2: error: ld returned 1 exit status zsh: exit 1 gcc -lusb usbtest.c % gcc usbtest.c -lusb % Забавно, но это не у одного меня так: https://askubuntu.com/questions/1190940/compiling-a-libusb-0-1-program-fails-with-undefined-reference-errors -- sergio.
Re: порядок аргументов gcc
On Fri, Sep 4, 2020 at 12:36 PM sergio wrote: > > On 04/09/2020 12:26, Stanislav Maslovski wrote: > > gcc --version > > gcc (Debian 10.2.0-6) 10.2.0 mator@ttip:~$ gcc -lusb usbtest.c mator@ttip:~$ gcc usbtest.c -lusb mator@ttip:~$ ./a.out mator@ttip:~$ rm ./a.out mator@ttip:~$ gcc --version gcc (Debian 10.2.0-6) 10.2.0 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Re: порядок аргументов gcc
On 04/09/2020 12:26, Stanislav Maslovski wrote: gcc --version gcc (Debian 10.2.0-6) 10.2.0 Это Sid -- sergio.
Re: порядок аргументов gcc
Доброго времени суток, On Fri, Sep 04, 2020 at 12:01:00PM +0300, sergio wrote: > gcc -lusb file.c > раньше работало, а теперь ругается на undefined reference и надо говорить > gcc file.c -lusb > Что произошло и что поменялось? Какая версия gcc? % gcc --version gcc (Debian 8.3.0-6) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % gcc usbtest.c -lusb % gcc -lusb usbtest.c % cat usbtest.c #include int main() { usb_init(); return 0; } -- Stanislav
порядок аргументов gcc
gcc -lusb file.c раньше работало, а теперь ругается на undefined reference и надо говорить gcc file.c -lusb Что произошло и что поменялось? -- sergio.