问题标签 [fpic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
plugins - 需要不支持的动态重定位 R_ARM_REL32;使用 -fPIC 重新编译
我正在通过 yocto 1.6 构建一个 gst 插件。我有 32 位和 64 位的 linaro 4.9 交叉工具链。当我使用 64 位工具链构建插件时,它是成功的(我得到了插件 .so 文件),而如果我使用 32 位工具链构建相同的源,我得到了以下错误
这里是整个错误
我很困惑,为什么在链接命令中提到了 -fPIC 却无法重新编译构建?我在 Makefile 和 libtool 脚本的任何地方都手动尝试了 -fPIC 选项,但没有用:(
和
在不修改源文件和配方文件的情况下,它在 32 位工具链中成功,而在 64 位工具链中失败,并告诉使用 -fPIC 选项重新编译
以下是构建机器信息。
makefile - CGAL 演示未运行
我一直在努力让他们工作。在安装库(通过 tarball)并通过 cmake-gui 安装我发现需要的每个依赖项之后,我设法使示例和一些 2D 演示工作。
我可以运行三角剖分和多边形演示,但是当我尝试制作多面体演示时,它达到 13% 并引发以下错误:
我用谷歌搜索了类似的错误,但我似乎无法将任何答案复制到其中。我尝试在 CMakeLists.txt 上添加 -fPIC 标志,但错误仍然存在。
使用 cmake-gui (我必须让其他一切正常工作)我注意到只有 QGLViewer-debug 包丢失。我试图找到它无济于事,无法理解如何制作第二个包的副本以使一个成为调试版本,也无法理解如何将包的正常版本转换为调试版本。而且我也看不出这是否与错误本身有关。
作为附带说明,AABB 树示例 Seg Faults 在启动时,在 cmake/make 区域没有错误。
我不知道此时该怎么办。我真的需要看到在这台计算机上运行的 3D 演示,以确保我可以使用这个库。
c++ - 除了共享库之外,g++ -fPIC 是否也适用于可执行文件?
我理解 g++ -fPIC 选项很好地解释了:GCC -fPIC 选项
我有许多源文件,这些源文件是通过makefile
构建来管理的。很难分离作为可执行文件或共享库一部分的源文件。我可以将 g++ 的 -fPIC 选项用于任何正在编译的文件:
稍后,如果它是共享库,则使用 链接-shared
,否则不-shared
使用可执行文件。
malloc - 我可以只构建 glibc malloc 作为共享库吗?
我想将 glibc malloc 构建为共享库,而不是作为 libc.so 的一部分
我没有使用任何 chroot,而是直接尝试构建它。
当我将 glibc 作为正常构建时,它输出用于构建 malloc 的命令,即:
gcc malloc.c -c -std=gnu99 -fgnu89-inline -O2 -Wall -Winline -Wundef -Wwrite-strings -fmerge-all-constants -frounding-math -g -Wstrict-prototypes -fPIC -DMORECORE_CLEARS=2 -I../include -I/home/sharath.g/glibc-2.20/build/malloc -I/home/sharath.g/glibc-2.20/build -I../sysdeps/unix/sysv/linux/x86_64/64 -I../sysdeps/unix/sysv/linux/x86_64 -I../sysdeps/unix/sysv/linux/x86 -I../sysdeps/unix/sysv/linux/wordsize-64 -I../sysdeps/x86_64/nptl -I../sysdeps/unix/sysv/linux -I../sysdeps/nptl -I../sysdeps/pthread -I../sysdeps/gnu -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/x86_64 -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/x86_64/64 -I../sysdeps/x86_64/fpu/multiarch -I../sysdeps/x86_64/fpu -I../sysdeps/x86/fpu -I../sysdeps/x86_64/multiarch -I../sysdeps/x86_64 -I../sysdeps/x86 -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64/wordsize-64 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/wordsize-64 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DPIC -DSHARED -o /home/sharath.g/glibc-2.20/build/malloc/malloc.o -MD -MP -MF /home/sharath.g/glibc-2.20/build/malloc/malloc.os.dt -MT /home/sharath.g/glibc-2.20/build/malloc/malloc.os
如您所见, malloc 是使用构建的,-fPIC
因此我应该能够简单地将其链接为共享库。
但是,当我运行此命令时
gcc -shared -Wl,-soname,libmalloc.so -shared -lpthread -lm -lrt -o /home/sharath.g/glibc-2.20/build/malloc/libmalloc.so /home/sharath.g/glibc-2.20/build/malloc/malloc.o
我收到一个错误
relocation R_X86_64_PC32 against undefined symbol `__libc_multiple_threads' can not be used when making a shared object; recompile with -fPIC
我不明白为什么会出现这个错误?显然我已经编译了 malloc.c-fPIC
gcc - 位置相关代码
我正在使用使用 sparc v8 架构的处理器。我想编译我的可执行文件,使每个函数调用都是绝对地址。使用 -fPIC 选项生成与位置无关的代码,此标志是否有任何反转?
ffmpeg - make/cmake 错误:创建共享对象时无法使用针对 `ff_a64_muxer' 的重定位 R_X86_64_32
这是正在发生的事情。我正在尝试设置 OpenSceneGraph,但是在制作过程中遇到了以下错误(添加空格以便于阅读):
此错误不会停止 cmake 进程。稍后(上述错误发生在 39%,进程在 46% 处失败),我收到此错误:
然后该过程停止。
我查看了其他一些解决方案,但他们没有我需要的东西(这里和这里)。我已经使用 -fPIC 标志运行了 cmake,但这并没有解决任何问题。
我在这里找到了一个潜在的解决方案,但我不知道如何实现“重新编译您的 FFmpeg/libavcodec/libavformat 并启用 pic”。任何人都可以通过它告诉我或给我一个很好的资源吗?我以前从未做过,我不想弄乱我的电脑。
任何帮助将非常感激。提前致谢!
shared-libraries - Libsourcey 缺少 -fPIC 编译错误
我正在尝试运行 LibSourcey 以使用 Webrtc 流服务器。
问题是我似乎无法让它工作。我努力在我的 Ubuntu 16.04(cmake 文件中的正则表达式)上 cmake 项目,但现在它已修复。我实际遇到的问题是编译时的共享对象错误:
任何帮助将不胜感激,因为我现在不知道该怎么做。
c++ - gcc vs clang:使用 -fPIC 内联函数
考虑这段代码:
使用 gcc 7.2 编译时:
这发出:
但是,当使用 clang 3.9 编译具有相同标志的相同代码时:
gccnext()
通过 PLT 调用,clang 内联它。last
两者仍然从 GOT 中查找。对于在 linux 上编译,clang 进行优化是否正确,而 gcc 错过了简单的内联,或者 clang 进行优化是错误的,或者这纯粹是 QoI 问题?
shared-libraries - 如何使用 fPIC 重新编译静态 gfortran 和 gcc 库
我正在从 Fortran 源代码编译一个共享库(用于 linux 系统),我想将其分发给世界各地的研究人员。我可以用gfortran -shared -o mylib.so ...
. 不幸的是,ldd mylib.so
它揭示了对各种 gfortran 和 gcc 库的依赖,我觉得这完全不能接受:
我希望我的程序能够开箱即用地执行,而不需要用户知道如何在他们的机器上安装 gfortran 以及如何确保他们拥有所需的库(例如 libgfortran.so.3
和没有libgfortran.so.4
)。
因此,我坚持将所有 gfotran 库静态链接到我的共享对象中。不幸的是gfortran -shared -static-libgfortran -static-libgcc
失败并出现错误
显然,.a
使用 gfortran 和 gcc 分发的文件没有使用与位置无关的代码进行编译。问题:我需要逐步说明如何使用与位置无关的代码重建上面列出的 gfortran 库文件的静态版本,以便我可以成功构建自己的共享库,并将 gfortran 库静态合并到其中,从而减少依赖。
python - Pip、pip3 和冲突的 Python 发行版
我在将 python 包 PyTransit 和 ktransit 安装到 Anaconda 3(在 Linux 上)时遇到问题。似乎很多其他人都有类似的错误,但他们的解决方案都没有对我有用。发生了一堆事情:
pip install ktransit
给出:
我会尝试将 ./configure 与 --enable-shared 一起使用,但没有配置文件。我尝试添加extra_compile_args = ["-fPIC"], extra_link_args=["-fPIC"]
到 setup.py (如https://github.com/h5py/h5py/issues/851),但什么也没做。
pip install pytransit
给出不同的错误:
这就是有趣的地方。使用 pip3(或 sudo pip)允许 ktransit 成功安装,但对 pytransit 没有任何作用。pip 和 pip3 似乎绑定到不同的地方:
最后,当我尝试通过 anaconda 在 jupyter notebook 中导入 ktransit 时,它会失败,但是当我在 Jupyter QtConsole 中导入 ktransit 时,它会成功,但似乎包含自身并且不提供实际功能。我的意思是我不能引用模块中的任何内容,并且:
我在想与 /usr/bin 相关联的任何版本的 python 都会以某种方式困扰我……或者我的 gcc 或 libgfortran 有问题?我有 gcc 版本 4.8.5 和 6(gcc --version 提供 4.8.5,但 -update-alternatives 说只有一个版本,6)。
感谢您花时间阅读本文。如果您有任何建议或想法,我将不胜感激!