把c代碼編譯成庫
❶ 我在烏班圖(linux)下將c語言編譯成動態鏈接庫(.s0),如何在安卓平台下 通過JNI調用我在linux下的.so
電腦上的CPU為 x86,手機CPU為ARM架構,你的動態鏈接庫必須要ARM版Gcc編譯器編譯後才能跑在手機上,Android NDK裡面附帶了一個ARM版的編譯器,你用NDK的編譯器重新編譯,然後就可以用JNI調用了,JNI調用不是一言兩語能說清的,有專門的教程,如果嫌麻煩,那就別用C寫。如果是做簡單的應用,幹嘛還要用C語言寫,JDK可以滿足絕大部分要求,要是嫌麻煩那就還是少碰NDK。
❷ 有個 c 文件,如何才能將其編譯成動態鏈接庫
有二個文件,一個 test.h, 一個 test.c
//test.h
#pragmaonce
#ifdef__cplusplus
extern"C"{
#endif
intadd(inta,intb);
#ifdef__cplusplus
}
#endif
//test.c
#include"test.h"
intadd(inta,intb)
{
returna+b;
}
編譯,生成動態鏈接庫:
#gcc-g3-Wall-fPIC-shared-olibtest.sotest.c
#ls-l
-rwxr-xr-x1rootroot14618Jul2413:44libtest.so
-rw-r--r--1rootroot63Jul2413:43test.c
-rw-r--r--1rootroot106Jul2413:43test.h
#nmlibtest.so
00000000002006e8a_DYNAMIC
0000000000200890a_GLOBAL_OFFSET_TABLE_
w_ITM_deregisterTMCloneTable
w_ITM_registerTMCloneTable
w_Jv_RegisterClasses
00000000002006c8d__CTOR_END__
00000000002006c0d__CTOR_LIST__
00000000002006d8d__DTOR_END__
00000000002006d0d__DTOR_LIST__
00000000000006b8r__FRAME_END__
00000000002006e0d__JCR_END__
00000000002006e0d__JCR_LIST__
00000000002008b8d__TMC_END__
00000000002008b8A__bss_start
w__cxa_finalize@@GLIBC_2.2.5
0000000000000620t__do_global_ctors_aux
0000000000000550t__do_global_dtors_aux
00000000002008b0d__dso_handle
w__gmon_start__
00000000002008b8A_edata
00000000002008c8A_end
0000000000000658T_fini
0000000000000468T_init
0000000000000600Tadd
00000000000004a0tcall_gmon_start
00000000002008b8bcompleted.6557
00000000000004c0tderegister_tm_clones
00000000002008c0bdtor_idx.6559
00000000000005d0tframe_mmy
0000000000000500tregister_tm_clones
❸ 怎麼才能將C語言程序,編譯成可執行文件,需要什麼庫和文件,怎麼建立庫和文件
需要C語言運行的環境,比如Microsoft Visual C++ 6.0,然後寫入可執行的文件,一般的簡單函數只需要<stdio.h>
❹ 如何將c語言的math.h編譯為靜態庫在mcu上使用
庫函數的源碼你是看不到的。要找實現的話得去網路。自帶的都是編譯好的東西(用到時直接調用)不是原C程序。
至於sin()的實現。如果你學過高數應該知道泰勒展開。
不知道的話直接給你公式:sin(x)=x-(x^3)/3!+(x^5)/5!+...(按這規律求和下去,x是弧度)
用一個for循環。要精確的話循環的次數多些就行
❺ 如何編譯C/Fortran動態/靜態鏈接庫
首先,傳統的編譯,也就是
靜態編譯
是把
源文件
翻譯成目標文件,這個是一次性過程,也就是你所謂的靜態編譯。
後來的Java和.NET等語言,首先編譯成中間形式,然後運行過程中根據需要編譯成本地代碼(注意這個過程不是一次性的,下次運行重新編譯),這個就是JIT(即時編譯)技術,從即時編譯發展出了動態編譯技術
————————————
(傳統的)編譯完成後,像C/C++、Fortran、匯編等語言,可以把多個目標文件合並到一個
庫文件
中,這個就是靜態庫。比如常說的
庫函數
printf就是libc裡面的函數。
如果有了啟動函數(main),main裡面使用了printf,就可以通過
靜態鏈接
技術,從libc中提取出printf所在的文件加入到可執行文件中,如果printf還需要其它函數,就繼續搜索並加入列表,直到形成一個
閉包
。這個就是靜態鏈接。
可是靜態鏈接有個明顯的缺點,如果每個程序都需要printf,那麼printf這個函數的代碼就會同時存在在每個程序中,這樣也太佔地方了吧。所以發明了動態連接技術,其實有兩種形式。無論哪一種,都是首先記錄下需要調用printf這個函數以及所在的
動態庫
,等到運行的時候再載入動態庫,從動態庫中找到真正的printf去執行。
由於,
動態鏈接
技術需要一些額外的信息,傳統的靜態庫是不具備的,這些額外信息主要是重復載入和卸載時所需要的一些代碼,因此需要
動態鏈接庫
。
❻ 如何編譯C和C++代碼寫的動態庫
來來來,新技能,linux下構建lib庫的步驟:
1、准備庫函數源文件;
my_add.c
int add(int a, int b){ printf("Here is my_add.c\n"); return a+b;}
my_sub.c
int sub(int a, int b){ printf("Here is my_sub.c \n"); return a-b;}
2、生成目標文件;
gcc -c my_add.c my_sub.c
會生成my_add.o,my_sub.o
3、對目標文件歸檔;
ar crv libmylib.a my_add.o my_sub.o
會生成libmylib.a
4、寫頭文件;
mylib.h
#ifndef _MY_LIB_H_#define _MY_LIB_H_ int add(int a, int b);int sub(int a, int b); #endif
5、測試程序;
test.c
#include "mylib.h"int main(){ printf(" MAIN:%d\n", add(12,24));}
6、編譯測試程序;
gcc test.c -L. -lmylib
答案摘自:log.anycle.com/skill/219.html
❼ c++中如何把類編譯成類似於庫文件,以後直接包含頭文件即可
要寫一個dll,還要有一個lib文件,還要導出類等等,蠻復雜的,具體你可以網上查一查
❽ C語言中如何將自己常用的函數封裝到編譯器的庫函數中具體應該怎麼做呢
用編譯器提供的庫管理工具。
C語言的編譯器都會提供一個命令行工具,可以把自己編譯後的.obj模塊加入指定的庫文件,以後使用時只需要連接該庫文件即可。這個命令行工具通常是lib.exe,用這個工具可以查看庫中的模塊,可以把模塊加入到庫中,可以從庫中刪除模塊。這個工具不僅僅是自己建立的庫文件的管理工具,可以管理所有的庫文件,包括C語言提供的標准庫。
❾ 我用c語言寫了兩個函數,怎麼把它變成c的庫函數隨時調用求解釋!
改成。h 放到庫文件里
調用函數時 包含這個。h文件即可