Red Hat: с компиляцией <atomic>все в порядке, но компоновщик не может найти __atomic_store_16; какая библиотека? - PullRequest
1 голос
/ 08 января 2020

Я использую atomic<> в первый раз, и так же, как при использовании <thread> требуется, чтобы вы связали библиотеку потоков, похоже, что при использовании <atomic> вы хотите ... что-то сделать. Что?

> uname -a
Linux sdclxd00239 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Dec 28 14:23:39 EST 2017 x86_64 x86_64 x86_64 GNU/Linu

> g++ Foo.cxx -g -o MsgQueueNoLock -pthread
/tmp/ccnGOKUG.o: In function `std::atomic<Ptr_T>::store(Ptr_T, std::memory_order)':
/opt/rh/devtoolset-7/root/usr/include/c++/7/atomic:239: undefined reference to `__atomic_store_16'
/tmp/ccnGOKUG.o: In function `std::atomic<Ptr_T>::load(std::memory_order) const':
/opt/rh/devtoolset-7/root/usr/include/c++/7/atomic:250: undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status>

g++ Foo.cxx -g -o Foo -pthread
/tmp/ccnGOKUG.o: In function `std::atomic<Ptr_T>::store(Ptr_T, std::memory_order)':
/opt/rh/devtoolset-7/root/usr/include/c++/7/atomic:239: undefined reference to `__atomic_store_16'
/tmp/ccnGOKUG.o: In function `std::atomic<Ptr_T>::load(std::memory_order) const':
/opt/rh/devtoolset-7/root/usr/include/c++/7/atomic:250: undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status

ОБНОВЛЕНИЕ: Мне нужно использовать -latomic. Справедливо! Однако я не могу найти тот, который действительно могу использовать.

Сначала я смотрю под /usr/lib и вижу, что у меня есть ссылка под gcc/.../4.8.2, указывающая на gcc/.../4.8.5? !!? Я никогда в своей жизни не видел, чтобы старая версия зависела от новой версии, хотя отметка времени заставляет меня заподозрить либо ручное вмешательство кого-то в прошлом, либо сложную историю.

> l `find /usr/lib -name '*atomic*'`
-rw-r--r--. 2 root root 1379 Jul 13  2017 /usr/lib/python2.7/site-packages/sos/plugins/atomichost.pyo
-rw-r--r--. 2 root root 1379 Jul 13  2017 /usr/lib/python2.7/site-packages/sos/plugins/atomichost.pyc
-rw-r--r--. 1 root root 1672 Jul 13  2017 /usr/lib/python2.7/site-packages/sos/plugins/atomichost.py
-rw-r--r--  1 root root   40 Sep 22  2017 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/libatomic.so
-rw-r--r--  1 root root   38 Sep 22  2017 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libatomic.so
lrwxrwxrwx  1 root root   44 Jul  3  2018 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libatomic.a -> ../../../i686-redhat-linux/4.8.5/libatomic.a

Что-то на ' net предположил, что я могу найти радость под /usr/local/lib, но на самом деле радости не найти:

> find /usr/local/lib -name '*atomic*'
>

Установленный g cc устарел (4.8.5), и я бегу 7.2.1 через утилиту scl, которая помещает /opt/rh/devtoolset-7/root/usr/bin/gcc в путь. В ожидании того, что необходимая библиотека, вероятно, была доставлена ​​с g cc, я смотрю на /opt/rh/devtoolset-7 ... и, как плохой сон, libatomi c .a снова является символической ссылкой на не существующий файл.

> l `find /opt/rh/devtoolset-7/ -name '*atomic*'`
    :
    (headers elided)
    :
-rw-r--r-- 1 root root 40975 Aug 31  2017 /opt/rh/devtoolset-7/root/usr/include/c++/7/atomic
-rw-r--r-- 1 root root    80 Aug 31  2017 /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libatomic.so
-rw-r--r-- 1 root root  1553 Oct  6  2017 /opt/rh/devtoolset-7/root/usr/share/systemtap/tapset/linux/atomic.stp
lrwxrwxrwx 1 root root    40 Jul  3  2018 /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libatomic.a -> ../../../i686-redhat-linux/7/libatomic.a

Таким образом, используя опции -L с каждым путем, который я могу придумать, основываясь на найденном find, вот все ошибки:

> g++ MsgQueueNoLock.cxx -g -o MsgQueueNoLock -pthread -latomic
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -latomic
collect2: error: ld returned 1 exit status
> g++ MsgQueueNoLock.cxx -g -o MsgQueueNoLock -pthread -L/usr/lib/gcc/x86_64-redhat-linux/4.8.2 -latomic
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find /usr/lib64/libatomic.so.1.0.0
collect2: error: ld returned 1 exit status
> g++ MsgQueueNoLock.cxx -g -o MsgQueueNoLock -pthread -L/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32 -latomic
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find /usr/lib/libatomic.so.1.0.0
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so when searching for -lstdc++
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libgcc_s.so when searching for -lgcc_s
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libgcc.a when searching for libgcc.a
collect2: error: ld returned 1 exit status
> g++ MsgQueueNoLock.cxx -g -o MsgQueueNoLock -pthread -L/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32 -latomic
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libatomic.so when searching for -latomic
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: cannot find -latomic
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libstdc++.so when searching for -lstdc++
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libgcc_s.so when searching for -lgcc_s
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: skipping incompatible /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/32/libgcc.a when searching for libgcc.a
collect2: error: ld returned 1 exit status

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Для использования 16-байтовой атомики с g cc вам нужно -latomic

0 голосов
/ 09 января 2020

Здесь приведен пример реализации libatomi c. c: https://gcc.gnu.org/wiki/Atomic/GCCMM?action=AttachFile&do=view&target=libatomic.c Его компиляция выдает несколько предупреждений, но в конечном итоге создает объектный файл.

> gcc -c -o libatomic.o libatomic.c
libatomic.c:475:1: warning: conflicting types for built-in function '__atomic_compare_exchange_1' [-Wbuiltin-declaration-mismatch]
 __atomic_compare_exchange_ ## SIZE   (I ## SIZE *mem, I ## SIZE *expect, I ## SIZE desired, int success, int failure)    \
 ^
libatomic.c:524:1: note: in expansion of macro 'ATOMIC_COMPARE_EXCHANGE'
 ATOMIC_COMPARE_EXCHANGE (1)
 ^~~~~~~~~~~~~~~~~~~~~~~
libatomic.c:475:1: warning: conflicting types for built-in function '__atomic_compare_exchange_2' [-Wbuiltin-declaration-mismatch]
 __atomic_compare_exchange_ ## SIZE   (I ## SIZE *mem, I ## SIZE *expect, I ## SIZE desired, int success, int failure)    \
 ^
libatomic.c:537:1: note: in expansion of macro 'ATOMIC_COMPARE_EXCHANGE'
 ATOMIC_COMPARE_EXCHANGE (2)
 ^~~~~~~~~~~~~~~~~~~~~~~
libatomic.c:475:1: warning: conflicting types for built-in function '__atomic_compare_exchange_4' [-Wbuiltin-declaration-mismatch]
 __atomic_compare_exchange_ ## SIZE   (I ## SIZE *mem, I ## SIZE *expect, I ## SIZE desired, int success, int failure)    \
 ^
libatomic.c:551:1: note: in expansion of macro 'ATOMIC_COMPARE_EXCHANGE'
 ATOMIC_COMPARE_EXCHANGE (4)
 ^~~~~~~~~~~~~~~~~~~~~~~
libatomic.c:475:1: warning: conflicting types for built-in function '__atomic_compare_exchange_8' [-Wbuiltin-declaration-mismatch]
 __atomic_compare_exchange_ ## SIZE   (I ## SIZE *mem, I ## SIZE *expect, I ## SIZE desired, int success, int failure)    \
 ^
libatomic.c:565:1: note: in expansion of macro 'ATOMIC_COMPARE_EXCHANGE'
 ATOMIC_COMPARE_EXCHANGE (8)
 ^~~~~~~~~~~~~~~~~~~~~~~
libatomic.c:475:1: warning: conflicting types for built-in function '__atomic_compare_exchange_16' [-Wbuiltin-declaration-mismatch]
 __atomic_compare_exchange_ ## SIZE   (I ## SIZE *mem, I ## SIZE *expect, I ## SIZE desired, int success, int failure)    \
 ^
libatomic.c:579:1: note: in expansion of macro 'ATOMIC_COMPARE_EXCHANGE'
 ATOMIC_COMPARE_EXCHANGE (16)
 ^~~~~~~~~~~~~~~~~~~~~~~
> ar rcs libatomic.a libatomic.o

> g++ Foo.cxx -g -o Foo-pthread -L. -latomic

Успешное связывание : бинарный создан без ошибок. Мое приложение слишком частично написано, чтобы судить о том, действительно ли оно работает.

Даже если это работает, это совершенно ясно: «не то, что вы должны делать, чтобы заставить его работать». Поэтому я не помечаю это как «ответ», просто оставляю его для дальнейшего использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...