我已经在Linux x86_x64上成功构建了几个32位,静态和共享库,我现在正试图将它们连接到一个可执行文件,我收到以下错误:
/usr/bin/ld: foo.so: __moddi3: invalid version 21 (max 0)
foo.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
其中foo.so是我构建的共享库之一.
__moddi3函数是libgcc Integer Library Routines的一部分.它的签名是:
— Runtime Function: long __moddi3 (long a, long b)
Run Code Online (Sandbox Code Playgroud)
它的规则是为32位代码提供64位算术.
我甚至找不到这个库的版本的含义.
为什么我现在看到这个错误 - 在库已经构建之后?
我用-fPIC和-m32标志构建了所有共享库,用于编译和链接.
可执行文件是CXX可执行文件.
这是使用--verbose的链接器输出
Using built-in specs.
COLLECT_GCC=/usr/bin/c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new …Run Code Online (Sandbox Code Playgroud) 场景:在Ubuntu 12.4 lxc主机上运行debootstrapped Ubuntu 11.4 lxc guest虚拟机(均为64位)
在lxc guest中,rsyslogd经常与SIGABRT崩溃,说明:
libgcc_s.so.1 must be installed for pthread_cancel to work
0334.380551272:7f4128a84700:
Signal 6 (SIGABRT) occured, execution must be terminated.
Run Code Online (Sandbox Code Playgroud)
我不确定为什么找不到libgcc_s.so.1.如果我运行ldconfig -p:
$# ldconfig -p | grep libgcc
libgcc_s.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /usr/lib32/libgcc_s.so.1
Run Code Online (Sandbox Code Playgroud)
它被列出.这两个链接都是有效的.
我该如何解决这个问题?
编辑:objdump -T输出请求:
/lib/x86_64-linux-gnu/libgcc_s.so.1: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
00000000000025d8 l d .init 0000000000000000 .init
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memset
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 w D …Run Code Online (Sandbox Code Playgroud) 我正在使用Anaconda 4.10.3, with Python 3.9.7, Scipy 1.7.1on Ubuntu 16.04.6。我需要运行的脚本使用 Scipy 的优化,并抛出以下错误:
ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.26' not found (required by /home/user/anaconda3/envs/work/lib/python3.9/site-packages/scipy/optimize/_group_columns.cpython-39-x86_64-linux-gnu.so)
Run Code Online (Sandbox Code Playgroud)
如错误所示,系统libstcc++.so.6不提供GLIBCXX_3.4.26,我使用它进行了验证
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
Run Code Online (Sandbox Code Playgroud)
然后我运行conda install libgcc并验证strings /home/user/anaconda3/envs/work/lib/libstdc++.so.6.0.29 | grep GLIBCXX显示GLIBCXX_3.4.26。然后我将以下行添加到我的.bashrc并运行source ~/.bashrc
LD_LIBRARY_PATH=/home/user/anaconda3/envs/work/lib/:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
当我在此之后运行脚本时,我仍然收到相同的错误 ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.26' not found。
我正在考虑降级 scipy,但是难道没有更好的方法可以在不降级的情况下解决这个问题吗?
我正在尝试安装交叉编译器,这个教程,当我想制作libgcc时,我只是放入make all-target-libgcc
我的终端.这使得抛出错误
checking whether ln -s works... yes
checking for i586-elf-gcc... /usr/src/build-gcc/./gcc/xgcc -B/usr/src/build-gcc/./gcc/ -B/usr/local/cross/i586-elf/bin/ -B/usr/local/cross/i586-elf/lib/ -isystem /usr/local/cross/i586-elf/include -isystem /usr/local/cross/i586-elf/sys-include
checking for suffix of object files... configure: error: in `/usr/src/build-gcc/i586-elf/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make: *** [configure-target-libgcc] Error 1
Run Code Online (Sandbox Code Playgroud)
在config.log中我找到了
Target: i586-elf
Configured with: ../gcc-4.8.0/configure --target=i586-elf --prefix=/usr/local/cross -- disable-nls --enable-languages=c,c++ --without-headers : (reconfigured) ../gcc-4.8.0/configure --target=i586-elf --prefix=/usr/local/cross --disable-nls --enable-languages=c,c++ --without-headers : (reconfigured) ../gcc-4.8.0/configure --target=i586-elf --prefix=/usr/local/cross --disable-nls --enable-languages=c,c++ …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化 double->text 转换(试图击败 grissu、ryu 等...)。
在这样做的同时,我将我的结果与sprintf输出进行比较。现在我遇到了上面有趣的案例。
printf("%.15e", 1e23);
Run Code Online (Sandbox Code Playgroud)
(例如 glibc)打印
9.999999999999999e+22
虽然我的日常打印
1.000000000000000e+23
现在这两个数字与“真实值”的距离相同,并且将这两个值转换回(例如使用atof)会产生相同的双精度值。
但是,我相信我的结果满足“四舍五入”规则(这就是它走这条路的原因)。
哪个结果更正确?
当我尝试在我的 Win 7 x64 机器上运行使用 Code::Blocks 编译的可执行文件时,它说它无法运行,因为缺少 libgcc_s_dw2-1。
我找到了一个解决方案,将库包含在链接器选项中。(这是我从这里得到的参考:http : //forums.codeblocks.org/index.php?topic=16748.0;prev_next=prev。看最后一篇文章)
问题是,当我转到链接器设置时,在项目构建选项中,那里没有可用的库。我必须下载吗
-static-libgcc
-static-libstdc++
Run Code Online (Sandbox Code Playgroud)
如帖子所述,并将它们放在一个目录中,以便 Code::Blocks 可以看到它们并将它们添加到链接器选项中?如果是,我应该把图书馆放在哪里?
我正在尝试使用最新的 Raspbian 系统映像在我的 Raspberry Pi 上编译 gcc5.3.0。
$ ./configure --enbale-checking=release --enable-languages=c,c++,fortran --host=arm-cortexa7_neon-linux-gnueabihf --build=arm-cortexa7_neon-linux-gnueabihf --target=arm-cortexa7_neon-linux-gnueabihf
$ make
Run Code Online (Sandbox Code Playgroud)
但是,原始编译器 (gcc4.9) 在编译 libgcc 时抱怨未创建 sys/cdefs.h。
我检查我有libc6-dev并build-essential安装。
所以我曾经grep -R 'cdefs' /usr/include/搜索过它,我在/usr/include/bsd/找到了它。我创建了 sys 目录并在 /usr/include/bsd/sys 下建立了到这些头文件的硬链接。
这次它给了我一个更奇怪的错误,/usr/include/stdio.h:312:8: error: unknown type name 'FILE'。
我在 stackoverflow 上搜索了这个,还有一个类似的问题,/sf/answers/1473306621/。但是当我删除/usr/include/sys和/usr/include/bsd,然后重新安装libc6-dev时,我在/usr/include下找不到sys/cdefs.h,编译器仍然报错。
我现在完全迷失了。任何建议将不胜感激。
我目前正在尝试将所有应用程序的依赖项编译为静态库。我的动机:
However, as I initially dreaded I had to go down the rabbit hole quite fast. I am currently stuck with OpenCV and I'm sure there is more to come. However, my main questions are:
如果我使用Rust语言构建DLL ,它是否需要libgcc*.dll在运行时出现?
一方面:
rustc.exe已经libgcc_s_dw2-1.dll在其目录中,并且cargo.exe从http://crates.io网站下载时不会在没有dll的情况下运行;另一方面:
所以,我很困惑.什么是明确的答案?
我的应用程序引入了许多共享库.有些是用C++编写的,它引入了libstdc ++.所以它引入了libgcc_s.so.还有一些是用简单的C编写的,并与-static-libgcc相关联.
所以现在我在多个共享库中静态链接了一些libgcc,并且libstdc ++在运行时动态加载libgcc的其他位.
Q1:这个设置会给我带来麻烦吗?libgcc是否具有会使这种混合链接出现问题的内部状态,还是只是内联函数?
Q2:为了让我的应用程序适用于较旧的Linux,我应该发布libstdc ++.so和libgcc_s.so并在主exe上使用rpath来加载它.这是正确的方法吗?
有没有办法在不构建gcc编译器的情况下构建libgcc?
我试图运行libgcc的配置脚本,但它说../../gcc/libgcc.mvars缺失.
我的基本需求是为多个平台构建libgcc,为各种版本的libgcc提供多种配置.
compiler-construction gcc compiler-errors compilation libgcc
我正在使用 cmake 生成 Eclipse CDT MinGW 项目。(Eclipse 版本开普勒)
这是我的 Cmakelist:
project(IMGTODICOM)
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
add_executable(IMGTODICOM IMGTODICOM.cxx)
target_link_libraries(IMGTODICOM ITKReview ${ITK_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
代码在我的电脑上编译运行没有问题,但在其他电脑上却无法运行。libgcc_s_dw2-1.dll需要一些类似的dll 。我在我的电脑中查找了这个dll,并在.dll中找到了它C:\MinGW\bin。为了解决这个问题,我将该文件夹的内容复制到另一台电脑上,exe文件最终运行。但是,我想知道是否有更好的方法在任何 Windows PC 中运行 exe 文件,并在编译过程中添加这些库。
我正在阅读,我应该使编译器链接到静态库。在 Eclipse 中,我尝试在“属性”>“C/C++ 包含路径和符号”以及“项目路径”>“库”下添加 dll,但它不起作用。我尝试修改 CmakeList 但它也不起作用。
我不知道为什么会出现这个问题,也不知道如何将 的内容包含C:\MinGW\bin在 exe 文件中。
非常感谢您的帮助
交叉使用外部工具链别名编译库的buildroot code sourcery lite 2011导致
output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
由于明显缺失 libgcc_s.a
# find . -iname "libgcc*"
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/plugin/libgcc
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc_eh.a
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过这个问题,但仍然静态链接?是否有CLFAGS或LDFLAGS选项可以静态链接所有内容除外libgcc_s?
到目前为止尝试的东西(除了阅读适用的部分ld和gcc手册页):
CFLAGS="-static -static-libgcc"
CFLAGS="-static -shared-libgcc"
CFLAGS="-static -static-libgcc -Wl,-Bstatic"
CFLAGS="-static -shared-libgcc -Wl,-Bstatic"
Run Code Online (Sandbox Code Playgroud)
添加后-Wl,-lgcc_s,-Bstatic我得到了大量的未定义/未知符号...(-Bshared不是有效的选项说ld)
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-glocalfileinfo.o): In function `_g_local_file_info_get':
glocalfileinfo.c:(.text+0x2d90): warning: Using 'getgrgid' in statically linked applications requires at runtime the shared libraries from …Run Code Online (Sandbox Code Playgroud)