當前位置:首頁 » 編程軟體 » 編譯sogcc

編譯sogcc

發布時間: 2022-11-14 03:56:25

㈠ 請問我有一個.so文件,如何在linux編程使用呢

-lxx

xx是你的.so文件名

其實使用方法和你使用數學庫函數是一樣的,源代碼中添加

#include <math.h>,編譯的時候,加上-lm參數。

註:linux下的.so文件為共享庫,相當於windows下的dll文件。

(1)編譯sogcc擴展閱讀:

linux下編寫調用so文件實例

.so是Linux(Unix)下的動態鏈接庫. 和.dll類似.

比如:

文件有: a.c, b.c, c.c

gcc -c a.c

gcc -c b.c

gcc -c c.c

gcc -shared libXXX.so a.o b.o c.o

要使用的話也很簡單. 比如編譯d.c, 使用到libXXX.so中的函數, libXXX.so地址是MYPATH
gcc d.c -o d -LMYPATH -lXXX

注意不是-llibXXX

test.c文件和一個test.h,這兩個文件要生成libsotest.so文件。然後我還有一個testso.c文件,在這個文件裡面調用libsotest.so中的函數。

編寫的過程中,首先是編譯so文件,我沒有編寫makefile文件,而是參考的2裡面說的直接寫的gcc命令。

因為so文件裡面沒有main函數,所以是不可執行的,所以編譯的時候要加上-c,只生成目標文件。

㈡ 怎樣把.c文件編譯成.so文件

.so是linux用的
所以 要生成so 需要用gcc
和生成可執行文件類似,只是增加一些編譯選項
命令如下
gcc SOURCE_FILES -fPIC -shared -o TARGET
SOURCE_FILES可以是.c文件,也可以是經過-c編譯出來的.o文件
TARGET為so文件。

㈢ LLINUX GCC 編譯C使用自定義動態鏈接庫.so的問題

1. 可以參考如下關於庫文件的文章:http://numanal.com/?p=129
2. 在編譯文件時最好用-L指明自定義庫的存在目錄, 利用如下任一語句(.so文件與.c文件在同一目錄):
gcc test.c -o test2 -L./verify.so
gcc test.c -o test2 -L.
3. 你這里在的問題應該與編譯器的某些兼容性有關, 在實際編寫程序的時候最好按gcc的語法規范走, 避免不必要的錯誤.

㈣ 關於gcc編譯選項選取動態庫不同版本的問題

不同版本的動態庫是為了升級方便,舊的程序需要與舊的庫鏈接,新的程序與新的.

一般的做法是把libabc.so連接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,這樣以後的新程序,在用gcc -labc的時候,都會鏈接到新的版本.舊的已經鏈接好的程序並不會產生不兼容的問題,因為舊程序在過去已經鏈接過了(動態庫鏈接的信息可以用ldd來查看: ldd /bin/ls).

symbolic link, ln是推薦的維護版本的辦法,不建議更改文件名.

如果你要有一個方便的辦法鏈接舊的版本, 建一個舊的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...

㈤ 求.so文件的編譯、修改方法

主要是gcc編譯時候選擇是靜態庫還是動態庫。如下
gcc -c test.c
ar -r test.a test.o 生成靜態庫

gcc -fPIC -shared test.c -o test.so 生成動態庫

自己生成的動態庫為了能夠讓ld找到,必須要修改連接路徑或者把動態庫放到指定的目錄裡面。

㈥ ubuntu下,用gcc編譯的so,在android下可以調用嗎

需要在終端定位到C文件所在的文件夾下,然後再使用gcc對C文件進行編譯不然會提示找不到文件。

㈦ gcc 在編譯時如何去尋找所需要的頭文件

當我們給

$ gcc -o foo.o foo.c

gcc怎麼知道去哪裡找foo.c裡面所include的header文件,連結資料庫與系統定義呢? 總共有下列來源指定gcc去那找。
當初在編譯時指定的(在~gcc/gcc/collect2.c:locatelib()
寫在specs內的
後來用-D -I -L指定的
gcc環境變數設定(編譯的時候)
ld.so的環境變數(這是run time的時候)


prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.9.5/

裡面有個很重要的specs這個檔案 gcc根據這個檔,做一些內定的動作。 通常系統上的specs內定裝起來是在

/usr/lib/gcc-lib/xxxx-gnulibc/version/

specs檔看起來是像這樣

*asm:
%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}

*asm_final:
%|

*cpp:
%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:
-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}

*cc1:
%(cc1_cpu) %{profile:-p}

*cc1plus:

*endfile:
%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s

*link:
-m elf_i386 %{shared:-shared} %{!shared: %{!ibcs: %{!static:
%{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker
/lib/ld-linux.so.2}} %{static:-static}}}

*lib:
%{shared: -lc --version-script libgcc.map%s} %{!shared: %{mieee-fp:-lieee}
%{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}}

*libgcc:
-lgcc

*startfile:
%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s}
%{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s}
%{shared:crtbeginS.o%s}

*switches_need_spaces:

*signed_char:
%{funsigned-char:-D__CHAR_UNSIGNED__}

*predefines:
-D__ELF__ -Dunix -Di386 -D__i386__ -Dlinux -Asystem(posix)

*cross_compile:
0

*version:
egcs-2.91.66

*multilib:
. ;

*multilib_defaults:

*multilib_extra:

*multilib_matches:

*linker:
collect2

*cpp_cpu_default:
-D__tune_i386__

*cpp_cpu:
-Asystem(unix) -Acpu(i386) -Amachine(i386) %{!ansi:-Di386}
-D__i386 -D__i386__ %{march=i486:-D__i486 -D__i486__}
%{march=pentium|march=i586:-D__pentium -D__pentium__ }
%{march=pentiumpro|march=i686:-D__pentiumpro -D__pentiumpro__ }
%{m386|mcpu=i386:-D__tune_i386__ } %{m486|mcpu=i486:-D__tune_i486__ }
%{mpentium|mcpu=pentium|mcpu=i586:-D__tune_pentium__ }
%{mpentiumpro|mcpu=pentiumpro|mcpu=i686:-D__tune_pentiumpro__ }
%{!mcpu*:%{!m386:%{!m486:%{!mpentium*:%(cpp_cpu_default)}}}}

*cc1_cpu:
%{!mcpu*: %{m386:-mcpu=i386} %{mno-486:-mcpu=i386 -march=i386}
%{m486:-mcpu=i486} %{mno-386:-mcpu=i486 -march=i486}
%{mno-pentium:-mcpu=i486 -march=i486} %{mpentium:-mcpu=pentium}
%{mno-pentiumpro:-mcpu=pentium} %{mpentiumpro:-mcpu=pentiumpro}}

在shell下用這行,-E 表示只做到preprocess就好

$ echo 'main(){}' | gcc -E -v -

你會看到gcc去讀specs檔

Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.2/specs
gcc version 2.95.2 20000220 (Debian GNU/Linux)
/usr/lib/gcc-lib/i386-linux/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -
GNU CPP version 2.95.2 20000220 (Debian GNU/Linux) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
End of omitted list.
# 1 ""
main(){}

所以有內定的定義,(就是用在#if defined #ifndef #define這些東西, 如果有定義這個字元串,就去編譯等等。) -Dxxxx -Dxxxx -Axxxx。 還有內定的include文件的搜尋路徑

/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

但是如果裝gcc的時候,是有給定的prefix的話,那麼就是

/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

所以header file的搜尋會從-I開始然後找gcc的環境變數 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH 再找上述的內定目錄
函式庫
當我們用到數學函式cos(),cos這個symbol,gcc並不曉它到底是什麼東西, 是變數,是函式,要預留多少空間給他等等,完全沒有任何訊息,你必須標頭 檔要#include ,gcc才知道。而且因為specs這個檔裡面只有要 link -lc也就是只有libc.so這個檔內的symbol會被搜尋, 像printf scanf等都在這裡面,可是像cos()等就沒有了, 所以函式庫的選項要多加 -lm ,這時ld才會來找libm這個函式庫,
編譯的時候,gcc會去找-L,再找gcc的環境變數LIBRARY_PATH,再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內的, gcc環境變數與pass給ld的機制在~gcc/gcc/collect2.c下找得到。 這上面只是搜尋路徑而已,如果要不加-lm 也能正確的主動搜尋某個特定的lib,例如libm, 就要去在specs這個檔案改一下,把math這個函式庫加進自動聯結函式庫 之一。就不用寫-lm了。
RUN TIME的時候, 如果編譯時沒有指定-static這個選項,其實可執行文件並不是真的可執行, 它必須在執行(run time)時需要ld.so來做最後的連結動作,建造一個可執行的 image丟到內存。如果是靜態連結,編譯時ld會去找libm.a的檔 。如果是動態連結去找libm.so。 所以每次有新改版程序, 或新加動態函式庫如果不在原本的/etc/ld.so.conf搜尋路徑中,都要把路徑 加進來,然後用

ldconfig -v

會重建cache並且顯示它所參照的函式庫。Run Time時ld.so才找得到lib"執行"。 ld與ld.so不一樣喔。
一些重要的程序

ld :Link Editor 連結各obj寫進一個可執行檔(executable)。
ldd :秀出一個執行文件用了那些動態函式庫。
ld.so :Dynamic Linker, 動態連結的話,是由ld.so完成執行時期symbol的
:參照與連結。
ld-linux.so :ELF文件的動態連結,跟ld.so一樣。只是ld.so是給a.out format的。
:新的glicb2的ld-linux.so.2已經跟ld.so.2結合成單一程序了。
ldconfig :根據/etc/ld.so.conf內的目錄,做出動態連結所需的cache檔。

ld 就是負責各個函式庫文件的信息寫進最後可執行檔(executable),所以它叫做 link editor,編譯時根據flags -L搜尋需要的lib,gcc也會把他的設定pass下來。 ld.so ld-linux.so.2是負責最後動態連結,叫做dynamic linker, RUN Time 執行程序時,它根據這個順序搜尋函式庫。
LD_LIBRARY_PATH 或LD_AOUT_LIBRARY_PATH環境變數所指的路徑
ldconfig所建立的cache
/lib /usr/lib內的檔
來找程序所需要的動態函式庫
ldconfig會根據/etc/ld.so.conf這個檔的設定,加上內定的兩個目錄 /lib /usr/lib來設定ld.so要用到所需要的連結 以及連結的cache到/etc/ld.so.cache。 所以如果換了新的函式庫,新的kernel,內部的標頭檔可能會有變化, 都要跟著改變讓gcc正確的找到,喔不,應該是cpp, ld, ld.so能正確的找到。 不然編出來的執行檔可能是錯誤的,執行時還可能segmentation fault。

㈧ 如何用gcc編譯生成動態鏈接庫*.so文件

生成動態鏈接庫的命令行為:
gcc -fPIC -shared -o libstr.so
當將main.c和動態鏈接庫進行連接生成可執行文件 的命令如下:
gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr
測試是否動態鏈接,如果列出libstr.so, 那麼應該是連接正常了ldd main註:1)-L.:表示連接的庫在當前的目錄中。

㈨ linux 怎麼編譯.so文件

.so是linux用的 所以 要生成so 需要用gcc 和生成可執行文件類似,只是增加一些編譯選項 命令如下 gcc SOURCE_FILES -fPIC -shared -o TARGET SOURCE_FILES可以是.c文件,也可以是經過-c編譯出來的.o文件 TARGET為so文件。

熱點內容
subplotpython 發布:2025-05-14 06:53:51 瀏覽:661
豎屏大屏導航工廠密碼一般是多少 發布:2025-05-14 06:49:29 瀏覽:806
如何在手機里設置無線網密碼 發布:2025-05-14 06:47:54 瀏覽:120
動態ip文件伺服器 發布:2025-05-14 06:44:22 瀏覽:891
文字分行的腳本有什麼 發布:2025-05-14 06:33:10 瀏覽:288
svn小烏龜怎麼配置 發布:2025-05-14 06:31:43 瀏覽:393
視頻播放器android 發布:2025-05-14 06:31:43 瀏覽:720
android工作室 發布:2025-05-14 06:26:00 瀏覽:658
汽車官方配置表如何下載 發布:2025-05-14 06:21:41 瀏覽:800
停車項目源碼 發布:2025-05-14 06:20:05 瀏覽:358