Red Hat:使用 <atomic> 编译正常,但链接器找不到 __atomic_store_16;什么图书馆?
Red Hat: using <atomic> compiles fine but linker can't find __atomic_store_16; what library?
我是第一次使用atomic<>
,就像使用<thread>
需要你link一个线程库一样,好像使用<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
下有一个 simlink 指向 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
网上有些东西暗示我可能会在 /usr/local/lib
下找到快乐,但实际上找不到快乐:
> find /usr/local/lib -name '*atomic*'
>
实际安装的 gcc 是旧版本 (4.8.5),我通过 scl 实用程序安装的是 运行 7.2.1,它将 /opt/rh/devtoolset-7/root/usr/bin/gcc
放入路径中。预计必要的 lib 可能与 gcc 一起交付,我查看 /opt/rh/devtoolset-7
... 就像一个噩梦 libatomic.a again 是一个 symlink 到一个不存在的文件。
> 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
因此,根据 find
发现的内容,对我能想到的每条路径使用 -L
选项,这是所有错误:
> 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
要在 gcc 中使用 16 字节原子,您需要 -latomic
这里有一个示例 libatomic.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
链接成功:二进制文件创建无误。我的应用程序写得太不完整了,无法判断它是否真的有效。
即使这行得通,也很清楚 "not what you're supposed to have to do to get it to work." 所以我不会将此标记为 "the" 答案,只是留作将来参考。
在 CentOS 中构建 64 位代码并需要 atomic
的人可能会偶然发现这篇文章,所以我只想补充一点,我实际上必须按如下方式安装它,
sudo yum install devtoolset-7-libatomic-devel
我对图书馆了解不多。我只是想编译 ponyc
,我首先需要 运行 以下命令,
yum install llvm-toolset-7
echo "source scl_source enable devtoolset-7 llvm-toolset-7" >> ~/.bashrc
我必须对 CMakeLists.txt 文件进行更多修改,但现在这些修改是题外话。
我是第一次使用atomic<>
,就像使用<thread>
需要你link一个线程库一样,好像使用<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
下有一个 simlink 指向 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
网上有些东西暗示我可能会在 /usr/local/lib
下找到快乐,但实际上找不到快乐:
> find /usr/local/lib -name '*atomic*'
>
实际安装的 gcc 是旧版本 (4.8.5),我通过 scl 实用程序安装的是 运行 7.2.1,它将 /opt/rh/devtoolset-7/root/usr/bin/gcc
放入路径中。预计必要的 lib 可能与 gcc 一起交付,我查看 /opt/rh/devtoolset-7
... 就像一个噩梦 libatomic.a again 是一个 symlink 到一个不存在的文件。
> 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
因此,根据 find
发现的内容,对我能想到的每条路径使用 -L
选项,这是所有错误:
> 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
要在 gcc 中使用 16 字节原子,您需要 -latomic
这里有一个示例 libatomic.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
链接成功:二进制文件创建无误。我的应用程序写得太不完整了,无法判断它是否真的有效。
即使这行得通,也很清楚 "not what you're supposed to have to do to get it to work." 所以我不会将此标记为 "the" 答案,只是留作将来参考。
在 CentOS 中构建 64 位代码并需要 atomic
的人可能会偶然发现这篇文章,所以我只想补充一点,我实际上必须按如下方式安装它,
sudo yum install devtoolset-7-libatomic-devel
我对图书馆了解不多。我只是想编译 ponyc
,我首先需要 运行 以下命令,
yum install llvm-toolset-7
echo "source scl_source enable devtoolset-7 llvm-toolset-7" >> ~/.bashrc
我必须对 CMakeLists.txt 文件进行更多修改,但现在这些修改是题外话。