gpt4 book ai didi

gcc - 在 32 位模式下编译 gcc 原子操作时出现链接错误

转载 作者:行者123 更新时间:2023-12-03 13:45:14 25 4
gpt4 key购买 nike

我有以下程序:

~/test> cat test.cc
int main()
{
int i = 3;
int j = __sync_add_and_fetch(&i, 1);
return 0;
}

我在多 CPU 64 位 Intel 机器上运行的 Linux 上使用 GCC 4.2.2 编译这个程序:
~/test> uname --all
Linux doom 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

当我在 64 位模式下编译程序时,它可以正常编译和链接:
~/test> /share/tools/gcc-4.2.2/bin/g++ test.cc
~/test>

当我在 32 位模式下编译它时,我收到以下错误:
~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 test.cc
/tmp/ccEVHGkB.o(.text+0x27): In function `main':
: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status
~/test>

虽然我永远不会真正在 32 位处理器上运行,但我确实需要一个 32 位可执行文件,以便可以链接一些 32 位库。

我的两个问题是:
  • 为什么在 32 位模式下编译时会出现链接错误?
  • 有没有办法让程序编译和链接,同时仍然能够与 32 位库链接?
  • 最佳答案

    Dan Udey 的回答很接近,事实上接近到足以让我找到真正的解决方案。

    根据手册页,“-mcpu”是“-mtune”的已弃用同义词,仅表示“针对特定 CPU 进行优化(但仍可在较旧的 CPU 上运行,尽管优化程度较低)”。我试过这个,它并没有解决问题。

    但是,“-march=”表示“为特定 CPU 生成代码(并且不在旧 CPU 上运行)”。当我尝试这样做时,它解决了问题:指定 i486 或更好的 CPU 消除了链接错误。

    ~/test> /share/tools/gcc-4.2.2/bin/g++ -m32  test.cc
    /tmp/ccYnYLj6.o(.text+0x27): In function `main':
    : undefined reference to `__sync_add_and_fetch_4'
    collect2: ld returned 1 exit status

    ~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=i386 test.cc
    /tmp/ccOr3ww8.o(.text+0x22): In function `main':
    : undefined reference to `__sync_add_and_fetch_4'
    collect2: ld returned 1 exit status

    ~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=i486 test.cc

    ~/test> /share/tools/gcc-4.2.2/bin/g++ -m32 -march=pentium test.cc

    关于gcc - 在 32 位模式下编译 gcc 原子操作时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/130740/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com