當前位置:首頁 » 編程軟體 » linux庫文件編譯

linux庫文件編譯

發布時間: 2022-07-06 01:32:29

『壹』 linux 如何運行編譯程序

gcc有多達100多個參數,現介紹常用的幾個。如果對其他參數也有興趣,可以參考:man gcc
預先處理選項
-E: 只對文件進行預處理,輸出結果到標准輸出
-C: 告訴預處理器不要丟棄注釋.配合`-E『選項使用. -P: 告訴預處理器不要產生`#line'命令.配合`-E'選項使用.
-v: 顯示正在使用的gcc的版本
常用編譯選項
-c: 將源程序編譯為目標代碼但並不做鏈接的工作,不生成最終的可執行文件,只生成一個與源文件文件名相同的以.o為後綴的目標文件。
-S:將遠程序編譯為一個後綴為.s的匯編語言文件,不會生成可執行文件
-x:強制編譯器用指定的語言編譯器來編譯某個源文件
gcc -x c++ test.c 表示強制用C++編譯器來編譯c程序
-static: 強制連接靜態庫,運行時不依賴動態庫
-share: 編譯時盡量使用動態庫
-o: 指定生成的可執行文件名,如果沒有該選項,如果生成可執行文件,默認文件名為a.out
編譯路徑選項
-i : 指定特定頭文件
gcc –c -i /home/zry/test.h test.c
-I<DIR>:依賴選項,指定頭文件路徑
Linux下大多數函數將頭文件放在/usr/include目錄下,如果需要指定其他路徑,可以使用該選項
gcc –I/home/zry/include –c test.c 添加/home/zry/include到查找路徑
-L<DIR> : 指定庫文件搜素路徑,用法同上
-l<庫名>:指定特定庫文件
gcc –lapp –c test.c
Linux的庫文件有一個約定,即以lib開頭,-lapp表示連接libapp.so庫文件
目標生成選項
-shared: 生成動態庫
gcc –shared libtest.so -i /home/zry/test.h test.c
生成靜態庫需要ar命令,後面講解
-fPIC: 生成可用於動態庫的位置獨立代碼。所有的內部定址均通過全局偏移表完成。
-ansi:支持符合ANSI標準的C程序.
該選項就會關閉GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof關鍵字以及諸如unix和vax這些表明當前系統類型的預定義宏。
__asm__, __extension__, __inline__和__typeof__仍然有效
使用`-ansi'選項的時候,預處理器會預定義一個__STRICT_ANSI__宏.有些頭文件 關注此宏,以避免聲明某些函數,或者避免定義某些宏,這些函數和宏不被ANSI標准調用;這樣就不會干擾在其他地方使用這些名字的程序了.
fno-asm:此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作關鍵字。
-fno-strict-prototype:只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式的對參數的個數和類型說明,而不是沒有參數.而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為沒有顯式說明的類型
-fthis-is-varialble:就是向傳統c++看齊,可以使用this當一般變數使用
-fcond-mismatch:允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型
-funsigned-char:
-fno-signed-char:
-fsigned-char:
-fno-unsigned-char:
這四個參數是對char類型進行設置,將char類型設置unsigned char(前兩個參數)或者 signed char(後兩個參數)
-imacros file: 將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身並不出現在輸入文件中
-Dmacro: 相當於C語言中的#define macro
-Dmacro=defn: 相當於C語言中的#define macro=defn
-Umacro: 相當於C語言中的#undef macro
-undef: 取消對任何非標准宏的定義
-M: 生成文件關聯的信息。包含目標文件所依賴的所有源代碼
-MM: 和M一樣,但是它將忽略由#include<file>造成的依賴關系。
-MD: -M相同,但是輸出將導入到.d的文件裡面
-MMD: 和-MM相同,但是輸出將導入到.d的文件裡面
警告選項
fsyntax-only:檢查程序中的語法錯誤,但是不產生輸出信息.
-w:禁止所有警告信息.
-Wno-import: 禁止所有關於#import的警告信息.
-pedantic:打開完全遵從ANSI C標准所需的全部警告診斷;拒絕接受採用了被禁止的語法擴展的程序.
-Werror:將所有警告轉換為錯誤
Werror選項要求GCC將所有警告當作錯誤進行處理。
-Wall: 顯示所有警告信息

『貳』 linux下c編程怎麼編譯

有以下步驟:

1.源程序的編譯
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器. 下面
我們以一個實例來說明如何使用gcc編譯器.
假設我們有下面一個非常簡單的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
要編譯這個程序,我們只要在命令行下執行:
gcc -o hello hello.c
gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程
序的輸出結果了.命令行中 gcc表示我們是用gcc來編譯我們的源程序,-o 選項表示
我們要求編譯器給我們輸出的可執行文件名為hello 而hello.c是我們的源程序文件.
gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了. -o選項我們
已經知道了,表示我們要求輸出的可執行文件名. -c選項表示我們只要求編譯器輸出
目標代碼,而不必要輸出可執行文件. -g選項表示我們要求編譯器在編譯的時候提
供我們以後對程序進行調試的信息.
知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程序了,如果你
想要知道更多的選項,可以查看gcc的幫助文檔,那裡有著許多對其它選項的詳細說
明.
2.Makefile的編寫
假設我們有下面這樣的一個程序,源代碼如下:

#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
當然由於這個程序是很短的我們可以這樣來編譯
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
這樣的話我們也可以產生main程序,而且也不時很麻煩.但是如果我們考慮一
下如果有一天我們修改了其中的一個文件(比如說mytool1.c)那麼我們難道還要重
新輸入上面的命令?也許你會說,這個很容易解決啊,我寫一個SHELL腳本,讓她幫我
去完成不就可以了.是的對於這個程序來說,是可以起到作用的.但是當我們把事情
想的更復雜一點,如果我們的程序有幾百個源程序的時候,難道也要編譯器重新一
個一個的去編譯?
為此,聰明的程序員們想出了一個很好的工具來做這件事情,這就是make.我們
只要執行以下make,就可以把上面的問題解決掉.在我們執行make之前,我們要先
編寫一個非常重要的文件.--Makefile.對於上面的那個程序來說,可能的一個
Makefile的文件是:
# 這是上面那個程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
有了這個Makefile文件,不過我們什麼時候修改了源程序當中的什麼文件,我們
只要執行make命令,我們的編譯器都只會去編譯和我們修改的文件有關的文件,其
它的文件她連理都不想去理的.
下面我們學習Makefile是如何編寫的.
在Makefile中也#開始的行都是注釋行.Makefile中最重要的是描述文件的依賴
關系的說明.一般的格式是:
target: components
TAB rule
第一行表示的是依賴關系.第二行是規則.
比如說我們上面的那個Makefile文件的第二行
main:main.o mytool1.o mytool2.o
表示我們的目標(target)main的依賴對象(components)是main.o mytool1.o
mytool2.o 當倚賴的對象在目標修改後修改的話,就要去執行規則一行所指定的命
令.就象我們的上面那個Makefile第三行所說的一樣要執行 gcc -o main main.o
mytool1.o mytool2.o 注意規則一行中的TAB表示那裡是一個TAB鍵
Makefile有三個非常有用的變數.分別是$@,$^,$<代表的意義分別是:
$@--目標文件,$^--所有的依賴文件,$<--第一個依賴文件.
如果我們使用上面三個變數,那麼我們可以簡化我們的Makefile文件為:
# 這是簡化後的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<
經過簡化後我們的Makefile是簡單了一點,不過人們有時候還想簡單一點.這里
我們學習一個Makefile的預設規則
.c.o:
gcc -c $<
這個規則表示所有的 .o文件都是依賴與相應的.c文件的.例如mytool.o依賴於
mytool.c這樣Makefile還可以變為:
# 這是再一次簡化後的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
好了,我們的Makefile 也差不多了,如果想知道更多的關於Makefile規則可以查
看相應的文檔.

3.程序庫的鏈接
試著編譯下面這個程序

#include
int main(int argc,char **argv)
{
double value;
printf("Value:%f\n",value);
}
這個程序相當簡單,但是當我們用 gcc -o temp temp.c 編譯時會出現下面所示
的錯誤.
/tmp/cc33Ky.o: In function `main':
/tmp/cc33Ky.o(.text+0xe): undefined reference to `log'
collect2: ld returned 1 exit status
出現這個錯誤是因為編譯器找不到log的具體實現.雖然我們包括了正確的頭
文件,但是我們在編譯的時候還是要連接確定的庫.在Linux下,為了使用數學函數,我
們必須和數學庫連接,為此我們要加入 -lm 選項. gcc -o temp temp.c -lm這樣才能夠
正確的編譯.也許有人要問,前面我們用printf函數的時候怎麼沒有連接庫呢?是這樣
的,對於一些常用的函數的實現,gcc編譯器會自動去連接一些常用庫,這樣我們就沒
有必要自己去指定了. 有時候我們在編譯程序的時候還要指定庫的路徑,這個時候
我們要用到編譯器的 -L選項指定路徑.比如說我們有一個庫在 /home/hoyt/mylib下
,這樣我們編譯的時候還要加上 -L/home/hoyt/mylib.對於一些標准庫來說,我們沒
有必要指出路徑.只要它們在起預設庫的路徑下就可以了.系統的預設庫的路徑/lib
/usr/lib /usr/local/lib 在這三個路徑下面的庫,我們可以不指定路徑.
還有一個問題,有時候我們使用了某個函數,但是我們不知道庫的名字,這個時
候怎麼辦呢?很抱歉,對於這個問題我也不知道答案,我只有一個傻辦法.首先,我到
標准庫路徑下面去找看看有沒有和我用的函數相關的庫,我就這樣找到了線程
(thread)函數的庫文件(libpthread.a). 當然,如果找不到,只有一個笨方法.比如我要找
sin這個函數所在的庫. 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然後看~/sin
文件,到那裡面去找了. 在sin文件當中,我會找到這樣的一行libm-2.1.2.so:00009fa0
W sin 這樣我就知道了sin在 libm-2.1.2.so庫裡面,我用 -lm選項就可以了(去掉前面
的lib和後面的版本標志,就剩下m了所以是 -lm).

4.程序的調試
我們編寫的程序不太可能一次性就會成功的,在我們的程序當中,會出現許許
多多我們想不到的錯誤,這個時候我們就要對我們的程序進行調試了.
最常用的調試軟體是gdb.如果你想在圖形界面下調試程序,那麼你現在可以選
擇xxgdb.記得要在編譯的時候加入 -g選項.關於gdb的使用可以看gdb的幫助文件.由
於我沒有用過這個軟體,所以我也不能夠說出如何使用. 不過我不喜歡用gdb.跟蹤
一個程序是很煩的事情,我一般用在程序當中輸出中間變數的值來調試程序的.當
然你可以選擇自己的辦法,沒有必要去學別人的.現在有了許多IDE環境,裡面已經自
己帶了調試器了.你可以選擇幾個試一試找出自己喜歡的一個用.

5.頭文件和系統求助
有時候我們只知道一個函數的大概形式,不記得確切的表達式,或者是不記得函數在那個頭文件進行了說明.這個時候我們可以求助系統,比如說我們想知道fread這個函數的確切形式,我們只要執行 man fread 系統就會輸出著函數的詳細解釋的.和這個函數所在的頭文件說明了。如果我們要write這個函數說明,當我們執行man write時,輸出的結果卻不是我們所需要的。因為我們要的是write這個函數的說明,可是出來的卻是write這個命令的說明。為了得到write的函數說明我們要用man 2 write。2表示我們用的是write這個函數是系統調用函數,還有一個我們常用的是3表示函數是c的庫函數。

『叄』 如何在linux下編譯,執行c程序

1.編譯單個源文件
[例如]在屏幕上列印"Hello,Linux."
[源代碼]#include<stdio.h
#include<stdlib.h
int main(int argc,char **argv){printf("Hello,Linux.\n");exit(0);}將源文件保存為hello.c,開始進行編譯
$gcc -o hello hello.c
編譯成功完成後,在當前路徑下,生成一個名為hello的文件,然後執行
$./hello在屏幕上,你將會看到列印結果:Hello,Linux.
說明:在默認情況下,編譯成功完成後,會在當前路徑下,生成一個名為a.out的文件,然後執行$./a.out便可列印結果,但通常可以通過選項-o來指定自己的可執行程序名稱;
2.編譯多個源文件
3.使用外部函數庫
4.使用共享函數庫和靜態函數庫5.gcc選項詳細描述

『肆』 linux靜態庫怎麼編譯

linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so
libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如:
libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個符號連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc
-shared
參數使其生成是動態庫而不是普通執行程序。
-wl
表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有
soname名字的文件,%b

『伍』 linux下將程序中用到的第三方庫編譯到自己的程序中

舉例,頭文件名 abc.h 函數名為 abc_test(); 第三方庫頭文件目錄為/abc/include/ 鏈接庫目錄為/abc/lib/ 1、頭文件和源文件:這是最好的情況,引用頭文件和相關函數即可。 如:#include "abc.h" abc_test();//直接調用即可 編譯時,Makefile中加入編譯選項 -I/abc/include 為了能將庫的頭文件引進來。 而且你的程序運行時,不再需要這個第三方庫。 2、靜態鏈接庫:引用頭文件和相關函數,設提供的靜態庫名為 libabc.lib 編譯時,Makefile中加入 編譯選項 1)-I/abc/include #編譯時加,為了能將庫的頭文件引進來; 2)-L/abc/lib -labc #鏈接時加的 而且你的程序運行時,不再需要這個第三方庫。 3、動態鏈接庫,設動態鏈接庫為libabc.so 調用動態鏈接庫文件,需要dlopen等函數 編譯時,Makefile中加入 編譯選項 1)-I/abc/include #編譯時加,為了能將庫的頭文件引進來; 2)-L/abc/lib -labc #鏈接時加的 注意:你的程序運行時,需要這個第三方庫的libabc.so文件。

『陸』 linux下如何手動編譯安裝bzip2庫

下載bzip2 下載地址:http://www.bzip.org/downloads.html
1>格式是*.tar.gz 解壓文件
tar -zxf bzip2-1.0.6.tar.gz 得到一個bzip2-1.0.6目錄
2>進入bzip2-1.0.6目錄
cd bzip2-1.0.6 //目錄視文件存放路徑而定
3>make -f Makefile-libbz2_so //-f 標志是使bzip2 根據另一個Makefile來編譯,就是Makefile-libbz2_so文件,創建一個動態的libbz.so庫文件,然後把bzip2工具連接到這個庫上
註:裝python的時候如果沒有這一步,python安裝不上bz2模塊
4>make && make install 此命令執行成功,就安裝完了
註:如果要重新安裝bzip2,要先執行:rm -vf /usr/bin/bz* 命令,不然make install 命令會失敗

『柒』 在linux中,怎麼用gcc編譯文件

在終端中輸入 gcc 文件名 -o 目標文件名
然後 ./目標文件名 就行了,沒有目標文件名,自動存為 a
執行 ./a 就行了。

在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include <myinc.h>
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。

GCC執行過程示例

示例代碼 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
預編譯過程:
這個過程處理宏定義和include,並做語法檢查。
可以看到預編譯後,代碼從5行擴展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
編譯過程:
這個階段,生成匯編代碼。
gcc -S a.i -o a.s
cat a.s | wc -l
59
匯編過程:
這個階段,生成目標代碼。
此過程生成ELF格式的目標代碼。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
鏈接過程:
鏈接過程。生成可執行代碼。鏈接分為兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。
gcc a.o -o a
程序運行:
./a
hello
編輯本段
GCC編譯簡單例子

編寫如下代碼:
#include <stdio.h>
int main()
{
printf("hello,world!\n");
}
執行情況如下:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.c -o hello
./hello
hello,world!

『捌』 linux動態庫編譯

Linux動態庫的編譯與使用 轉載
http://hi..com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html
Linux下的動態庫以.so為後綴,我也是初次在Linux下使用動態庫,寫一點入門步驟,以便以後能方便使用。
第一步:編寫Linux程序庫
文件1.動態庫介面文件
//動態庫介面文件getmaxlen.h
#ifndef _GETMAXLEN_H_
#define _GETMAXLEN_H_
int getMaxLen(int *sel,int N);
#endif
文件2.動態庫程序實現文件
//動態庫程序實現文件getmaxlen.c
#include "getmaxlen.h"
int getMaxLen(int *sel,int N)
{
int n1=1,n2=1;
for(int i=1;i<N;i++)
{
if(sel[i]>sel[i-1])
{
n2 ++;
if(n2 > n1)
{
n1 = n2;
}
}
else
{
n2 = 1;
}
}
return n1;
}
第二步:編譯生成動態庫
gcc getmaxlen.c –fPIC –shared –o libtest.so
由以上命令生成動態庫libtest.so,為了不需要動態載入動態庫,在命令時需以lib開頭以.so為後綴。
–fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
–shared:指明編譯成動態庫。
第三步:使用動態庫
1. 編譯時使用動態庫
文件1.動態庫使用文件test.c
//使用動態庫libtest.so,該文件名為test.c
#include "getmaxlen.h"
int main()
{
int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};
int m;
m = getMaxLen(Sel,15);
printf("%d",m);
return 0;
}
編譯命令:
gcc test.c –L . –l test –o test
–L:指明動態庫所在的目錄
-l:指明動態庫的名稱,該名稱是處在頭lib和後綴.so中的名稱,如上動態庫libtest.so的l參數為-l test。
測試:
ldd test
ldd 測試可執行文件所使用的動態庫
2. 動態載入方式使用動態庫
文件內容:
//動態庫的動態載入使用
int main()
{
void *handle = NULL;
int (*getMaxLen)(int *sel,int N);
int sel[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};
handle = dlopen("./libtest.so",RTLD_LAZY);
if(handle == NULL)
{
printf("dll loading error.\n");
return 0;
}
getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");
if(dlerror()!=NULL)
{
printf("fun load error.\n");
return 0;
}
printf("%d\n",getMaxLen(sel,15));
}
編譯命令:
gcc –ldl test1.c –o test
gcc -o test test.c ./libmytools.so

『玖』 如何在linux下編譯opencl的庫

對於Ubuntu或其近親(Lubuntu、Kubuntu、Mint等)編寫OpenCL程序也不會太難。由於本例用的是AMD APP SDK,因此需要AMD的GPU以及相關驅動。首先,去AMD官網下載GPU驅動——AMD Catalyst。如果你用的是APU並且還有一塊獨立顯卡的話,通過AMD Catalyst Control Center可以選擇使用哪個GPU。像我現在用的聯想Z475筆記本,搭載了AMD APU A6-3420M以及一塊AMD Radeon HD 7400M,但是相比較而言,還是APU自帶的6620G的GPU性能更強一些,因此我這邊設置的是採用AMD Radeon HD 6620G。

在Linux下,AMD官方的GPU驅動是.run文件,只需使用sudo sh xxx.run即可安裝。安裝時採用默認安裝即可。

然後去developer.amd.com開發者網站下載AMD APP SDK。下載完成之後,將lib裡面的動態庫文件(xxx.so)取出來,並且把include里的頭文件取出來。在你的OpenCL工程中把頭文件的路徑以及動態載入庫都設置好。在你用-l的時候,如果動態庫文件後綴名為.so.1,那麼得把文件名後綴.1去掉。因為-l只能連接.a、.lib、.so等這些後綴的庫文件。

熱點內容
左游手柄助手2腳本 發布:2024-05-19 11:40:28 瀏覽:1001
挖礦需要什麼配置 發布:2024-05-19 11:38:02 瀏覽:894
eclipse導出ant腳本 發布:2024-05-19 11:20:28 瀏覽:98
如何改變vivo手機賬戶密碼 發布:2024-05-19 10:56:07 瀏覽:376
sql的length函數 發布:2024-05-19 10:55:15 瀏覽:545
資料庫管理系統設計報告 發布:2024-05-19 10:49:50 瀏覽:684
linux怎麼將驅動編譯進內核 發布:2024-05-19 10:23:47 瀏覽:768
c語言讀程序題 發布:2024-05-19 10:13:52 瀏覽:675
新的安卓手機怎麼樣下載微信 發布:2024-05-19 10:05:06 瀏覽:879
加9的演算法 發布:2024-05-19 10:04:15 瀏覽:264