❶ 靜態庫提示加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:產生位置無關碼
解釋一下,位置無關碼就是可以在進程的任意內存位置執行的目標碼,動態鏈接庫必須使用。