❶ 静态库提示加fipc是什么意思
在使用静态库时,如果出现需要加入“-fPIC”的提示,一般是由于静态库中的一些代码(比如全局变量等)在编译时未被编译成位戚敏置无关代码(Position Independent Code, PIC),而导致的。加上“-fPIC”参数可以让编译器在编肆吵译时生成位置无关代码,以使静态库在链接时更加灵活、安全和可移植。
在linux环境下,可以在编译时使用如下命令来加入“-fPIC”选项:
gcc -c -fPIC example.c -o example.o
这里裂仔侍的“-c”表示仅进行编译而不进行链接,“-fPIC”表示生成位置无关代码。如果要将多个目标文件打包成静态库,则可以使用如下命令:
ar rcs libexample.a example1.o example2.o example3.o
其中“libexample.a”为静态库的名称,“example1.o”等为目标文件。
需要注意的是,加入“-fPIC”选项会稍微降低代码执行效率,因此在编译时需要根据具体情况权衡是否需要加入该选项。
❷ 使用-fPIC选项编译出protobuf静态库libprotobuf.a
用的64位Ubuntu系统,开发一个共享库so使用到了protobuf,如果链接libprotobuf.so就需要一起打包带走,否则可能因protobuf版轮顷丛本较多腊樱出现版本不匹配的问题,所以需要它链接静态库libprotobuf.a,但是链乎携接时候报错: relocation R_X86_64_32 against `a local symbol’ can not be used when making a shared object; recompile with -fPIC。
❸ Linux下使用make命令,总是报要加上“-fPIC”,请问如何加
gcc -c -fpic XXX.c
❹ 如何使用自己的makefile编译android ndk项目
android ndk提供了一套自己的makefile管理方式,要将源码项目移植到android平台,需要按照android的makefile规则编写makefile,还要按android的规则部署源码目录,对一个有自己的makefile管理方法的大型项目来说,只是做一下makefile迁移工作就是一件很麻烦的事。
其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可以编译出在android运行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本为例:
编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名称前缀 arm-eabi-
头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
库文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?
有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?
只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到确实带了很多参数
编译参数:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
链接参数:
-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。
❺ gcc编译错误!
提示说需要-fPIC编译,然后在链接动态库的地方加上-fPIC的参数编译结果还是报错,需要把共享库所用到的所有静态库都采用-fPIC编译一边才可以成功的在64位环境下编译出动态库。
这里的-fPIC指的是地址无关代码
你看看这里的这篇文章吧:http://www.cnblogs.com/lightsalt/archive/2011/10/19/2217628.html
❻ gcc 生成动态库时-fpic选项是什么意思。
fpic:产生位置无关码
解释一下,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用。