首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红帽:使用<atomic>编译很好,但是链接器找不到__atomic_store_16;什么库?

红帽:使用<atomic>编译很好,但是链接器找不到__atomic_store_16;什么库?
EN

Stack Overflow用户
提问于 2020-01-08 08:27:25
回答 3查看 2.2K关注 0票数 4

我第一次使用atomic<>,正如使用<thread>要求您链接线程库一样,似乎使用<atomic>需要您这样做。某物。什么?

代码语言:javascript
复制
> 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下面有一个simlink指向gcc/.../4.8.5?!?在我的一生中,我从未见过一个旧版本依赖于一个新版本,尽管时间戳让我怀疑过去有人手动干预,或者是复杂的历史。

代码语言:javascript
复制
> 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

网上的一些信息表明,我可能会在/usr/local/lib下找到joy,但实际上没有人能找到joy:

代码语言:javascript
复制
> find /usr/local/lib -name '*atomic*'
>

gcc的实际安装是旧的(4.8.5),我通过scl实用程序运行7.2.1,它将/opt/rh/devtoolset-7/root/usr/bin/gcc放入路径中。由于预期所需的库可能与gcc一起交付,我看了/opt/rh/devtoolset-7 .和噩梦一样,libatomic.a也是一个指向一个不存在的文件的符号链接。

代码语言:javascript
复制
> 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发现的每一条路径一起使用,下面是所有的错误:

代码语言:javascript
复制
> 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-09 02:09:03

这里有一个示例libatomic.c实现:https://gcc.gnu.org/wiki/Atomic/GCCMM?action=AttachFile&do=view&target=libatomic.c --它的编译会产生几个警告,但最终会生成一个对象文件。

代码语言:javascript
复制
> 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

链接成功:二进制文件是无错误创建的。我的应用程序写得太少了,无法判断它是否真的有效。

即使这是可行的,它也是非常清楚的“不是你应该做什么才能让它起作用。”所以我不把它标记为“答案”,只是把它留给将来参考。

票数 0
EN

Stack Overflow用户

发布于 2020-01-08 08:37:04

要与gcc一起使用16字节原子,您需要-latomic

票数 4
EN

Stack Overflow用户

发布于 2020-12-05 04:17:55

在CentOS中构建64位代码并需要atomic的人可能会无意中发现本文,因此我只想补充说,我实际上必须按如下方式安装它,

代码语言:javascript
复制
sudo yum install devtoolset-7-libatomic-devel

我对图书馆知之甚少。我只是想编译ponyc,首先需要运行以下命令,

代码语言:javascript
复制
yum install llvm-toolset-7
echo "source scl_source enable devtoolset-7 llvm-toolset-7" >> ~/.bashrc

我还需要对CMakeLists.txt文件进行更多的修改,但这将是一个非主题的问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59641984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档