『壹』 linux下如何用c++編譯so文件,c語言又怎樣調用這個so文件
根據相應的頭文件、和鏈接使用的庫文件,編譯鏈接後,即是可以使用該.so文件了
~~~~~~~
『貳』 linux的C編程,怎麼使用so文件
linux下的.so文件為共享庫,相當於windows下的dll文件,使用方法如下:
在你的工程源代碼里包含.h頭文件,然後可以調用動態庫里的函數,在鏈接的時候加上如下編譯器參數:
-l xx.so
如果你的so文件是以lib開頭的,還可以直接這樣使用:
-lxx
xx是你的.so文件名
其實使用方法和你使用數學庫函數是一樣的,源代碼中添加
#include <math.h>,編譯的時候,加上-lm參數。
『叄』 問個C語言生成.so文件的問題
關於那個aaa.h,它是只要跟aaa.c放在同一個目錄下就一起編譯到aaa.so里
『肆』 怎樣把.c文件編譯成.so文件
.so是linux用的
所以 要生成so 需要用gcc
和生成可執行文件類似,只是增加一些編譯選項
命令如下
gcc SOURCE_FILES -fPIC -shared -o TARGET
SOURCE_FILES可以是.c文件,也可以是經過-c編譯出來的.o文件
TARGET為so文件。
『伍』 Linux下如何將多個.c文件生成.so文件
頭文件只是在開發編譯的時候才會用到,生成動態庫的時候記得在gcc編譯的時加上-fPIC參數
『陸』 Linux c調用so
實例代碼(soTest.c):
1 #include <stdio.h>
2 #include <dlfcn.h>
3
4 int main(int argc, char *argv[]){
5 void * libm_handle = NULL;
6 float (*cosf_method)(float);
7 char *errorInfo;
8 float result;
9
10 // dlopen 函數還會自動解析共享庫中的依賴項。這樣,如果您打開了一個依賴於其他共享庫的對象,它就會自動載入它們。
11 // 函數返回一個句柄,該句柄用於後續的 API 調用
12 libm_handle = dlopen("libm.so", RTLD_LAZY );
13 // 如果返回 NULL 句柄,表示無法找到對象文件,過程結束。否則的話,將會得到對象的一個句柄,可以進一步詢問對象
14 if (!libm_handle){
15 // 如果返回 NULL 句柄,通過dlerror方法可以取得無法訪問對象的原因
16 printf("Open Error:%s.\n",dlerror());
17 return 0;
18 }
19
20 // 使用 dlsym 函數,嘗試解析新打開的對象文件中的符號。您將會得到一個有效的指向該符號的指針,或者是得到一個 NULL 並返回一個錯誤
21 cosf_method = dlsym(libm_handle,"cosf");
22 errorInfo = dlerror();// 調用dlerror方法,返回錯誤信息的同時,內存中的錯誤信息被清空
23 if (errorInfo != NULL){
24 printf("Dlsym Error:%s.\n",errorInfo);
25 return 0;
26 }
27
28 // 執行「cosf」方法
29 result = (*cosf_method)(0.0);
30 printf("result = %f.\n",result);
31
32 // 調用 ELF 對象中的目標函數後,通過調用 dlclose 來關閉對它的訪問
33 dlclose(libm_handle);
34
35 return 0;
36 }
在這個例子中主要是調用了 math 庫(libm.so)中的「cosf」函數,dlopen函數的第二個參數表示載入庫文件的模式,主要有兩種:RTLD_LAZY 暫緩決定,等有需要時再解出符號;RTLD_NOW 立即決定,返回前解除所有未決定的符號。另外記得引用包含API的頭文件「#include <dlfcn.h>」(^_^)。
『柒』 用cc怎樣把.c文件編譯成.so文件
比如有一個test.c文件,我想打包成動態庫test.so,
直接gcc test.c -o test.o -fPIC
gcc -o test.so test.o -shared
使用的時候發布.so和頭文件即可。
鏈接的時候要記得丟在默認目錄或者將其所在目錄聲明到環境變數,不然有時候會提示找不到這個庫文件。
『捌』 linux中把.c的文件編譯成.so
就跟用VS編譯dll或者lib文件差不多,把代碼編譯完成以後,命名為相應的後綴就好了。
例如:
gcc -c -fPIC libst.c
生成 libst.o
然後
gcc -shared -fPIC -o libst.so libst.o
生成 libst.so 動態鏈接庫
把libst.so拷貝到系統默認庫目錄下,比如 /lib, /usr/lib 下
假定有 test.c 要引用這個庫
gcc -lst -o test test.c
然後就可以了
假如不能把libst.so拷貝到默認庫目錄下,比方說放在了
/home/aaa/lib 下
那麼就用這樣的語句來編譯test.c
gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c
『玖』 linux下c語言編譯so問題
不需要在自己的.so中調用別人的.so,只需要編譯自己的,編譯.so時,系統不會檢查未定義的函數。
直接在編譯自己的應用程序時鏈接這兩個.so就可以了!
gcc
-o
exec_file
mysrc.c
-L./
-lXXX
-L/usr/lib
-lmysqlclient
『拾』 C/C++源文件直接交叉編譯生成.so文件供安卓應用程序調用,可以嗎
Jni調用就行了,是要按規則寫介面api,如果介面很多,也沒法,那是你的業務問題,要重新設計業務邏輯。我們之前用的c++單獨交叉編譯一個進程,和安卓界面用tcp通信,如果介面多也以為著協議多,一樣的。