當前位置:首頁 » 操作系統 » linuxc庫函數

linuxc庫函數

發布時間: 2023-03-01 12:27:23

1. linuxc語言的庫函數的頭文件放在哪個目錄下啊

一般來說是放在/usr/include目錄下的;

但是這個並不局限也是可控的,如果我們進行開發過程中, 就會在內核的庫函數文件目錄:

例如在:/XXX/XXX/linux-X.X/include

所以根據不同的情況,頭文件存放的目錄也是不同的,具體需要可以根據locate和grep命令進行查詢。

2. 在Linux下,在C中怎麼調用C++的庫函數

調用C++函數庫,一般不能直接調用,需要將C++庫轉換成C介面輸出,方可以使用C調用
將 C++ 函數聲明為``extern "C"''(在你的 C++ 代碼里做這個聲明),然後調用它(在你的 C 或者 C++ 代碼里調用)。例如:
// C++ code:
extern "C" void f(int);
void f(int i)
{
// ...
}

然後,你可以這樣使用 f():
/* C code: */
void f(int);
void cc(int i)
{
f(i);
/* ... */
}

當然,這招只適用於非成員函數。如果你想要在 C 里調用成員函數(包括虛函數),則需要提供一個簡單的包裝(wrapper)。例如:
// C++ code:
class C
{
// ...
virtual double f(int);
};

extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}

然後,你就可以這樣調用 C::f():
/* C code: */
double call_C_f(struct C* p, int i);

void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}

如果你想在 C 里調用重載函數,則必須提供不同名字的包裝,這樣才能被 C 代碼調用。例如:
// C++ code:
void f(int);
void f(double);

extern "C" void f_i(int i) { f(i); }
extern "C" void f_d(double d) { f(d); }

然後,你可以這樣使用每個重載的 f():
/* C code: */

void f_i(int);
void f_d(double);

void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
注意,這些技巧也適用於在 C 里調用 C++ 類庫,即使你不能(或者不想)修改 C++ 頭文件。

再看下面的例子:
aa.cxx
#include "aa.h"
int sample::method()
{
cout<<"method is called!\n";
}
aa.h
#include
using namespace std;
class sample
{
public:
int method();
};
將上面的兩個文件生成動態庫libaa.so放到 /usr/lib目錄下,編譯命令如下
sudo g++ -fpic -shared -g -o /usr/lib/libaa.so aa.cxx -I ./
由於在C中不能識別類,所以要將上面類的成員函數封裝成C介面函數輸出,下面進行封裝,將輸出介面轉換成C介面。
mylib.cxx
#include "add.h"
#ifndef _cplusplus
#define _cplusplus
#include "mylib.h"
#endif

int myfunc()
{
sample ss;
ss.method();
return 0;
}
mylib.h
#ifdef _cplusplus
extern "C"
{
#endif

int myfunc();

#ifdef _cplusplus
}
#endif
在linux下,gcc編譯器並沒用變數_cplusplus來區分是C代碼還是C++代碼,如果使用gcc編譯器,這里我們可以自己定義一個變數_cplusplus用於區分C和C++代碼,所以在mylib.cxx中定義了一個變數_cplusplus用於識別是否需要「extern "C"」將函數介面封裝成C介面。但是如果使用g++編譯器則不需要專門定義_cplusplus,編譯命令如下:
g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I ./
main.c
#include
#include
#include "mylib.h"
int
main()
{
int (*dlfunc)();
void *handle; //定義一個句柄
handle = dlopen("./mylib.so", RTLD_LAZY);//獲得庫句柄
dlfunc = dlsym(handle, "myfunc"); //獲得函數入口
(*dlfunc)();
dlclose(handle);

return 0;
}
編譯命令如下:
gcc -o main main.c ./mylib.so -ldl
下面就可以執行了。
需要說明的是,由於main.c 和 mylib.cxx都需要包含mylib.h,並且要將函數myfunc封裝成C介面函數輸出需要「extern "C"」,而C又不識別「extern "C"」,所以需要定義_cplusplus來區別處理mylib.h中的函數myfunc。
在main.c的main函數中直接調用myfunc()函數也能執行,這里介紹的是常規調用庫函數的方法。

3. linux系統調用 shell命令 c庫函數怎麼區分

首先,命令應該是好和其他兩個區分開來的了,因為命令都是可以直接敲在shell上面回車執行的,而系統調用和庫函數都不行;
其次,Linux系統調用和C庫函數都是函數的形式,即都是「func(args)」的形式,但系統調用是
由系統內核對外提供的服務介面;C庫函數和你自己寫的普通的函數沒有本質的區別,只是在C標准庫中而已,Linux上面glibc就是C函數庫。從表面上看兩者不太好區分,不過,你可以從它們需要包含的頭文件來區分,C庫函數像printf在
中,std就是標准(standard)的縮寫形式,因此在
中的函數,基本都是C庫函數;像
ssize_t
read(int
fd,
void
*buf,
size_t
count);這樣很多的系統調用是包含在
中的,unistd意思是UNIX
Standard,從這個意義就可以區分了。
希望對你有所幫助,如還有問題,可隨時聯系我:-)

4. linuxc語言函數庫在什麼路徑

一般來說是放在/usr/include目錄下的;

但是這個並不局限也是可控的,如果我們進行開發過程中, 就會在內核的庫函數文件目錄:
例如在:/XXX/XXX/linux-X.X/include
所以根據不同的情況,頭文件存放的目錄也是不同的,具體需要可以根據locate和grep命令進行查詢。

5. linux 下 C/C++ 使用標准庫函數 ( 可能造成的內存泄露問題)

c++
用的是
delete吧..
我覺得系統會自動調用釋放內存的函數的
應該不用自己加的.
無論返回什麽結構
在內存調用完的每個函數的入口地址都是指向函數的指針阿.
就像你的例子
tm*
指向
localtime()入口地址
如果系統沒有自動釋放的話
後果將不堪設想喔..
想想全局變數帶來的危機
其實道理差不多
所以不用free了吧..
我猜的.
哈哈.

6. 關於 Linux c 的函數庫文件的 路徑問題

要學會用man,特別是man2(系統調用)和man3(C函數庫),比如:


mansqrt

會顯示需要引用的頭文件,編譯時需要的動態鏈接庫

如果重復,則需要指定手冊章節,比如

manwrite顯示的是write程序幫助,如果想看系統調用,則要輸入man2wirte

另外,/lib64:/lib:/usr/lib64:/usr/lib這些是系統預設的,不用指定

熱點內容
平板拷貝如何緩存 發布:2025-08-16 23:19:05 瀏覽:599
繽越混動有哪些配置 發布:2025-08-16 23:17:57 瀏覽:247
刪除linux文件後 發布:2025-08-16 23:09:04 瀏覽:648
采訪時的采訪問題 發布:2025-08-16 23:07:27 瀏覽:110
電腦客戶端登錄伺服器怎麼清除 發布:2025-08-16 22:55:46 瀏覽:525
壓縮小木條 發布:2025-08-16 22:55:41 瀏覽:20
存款利率演算法 發布:2025-08-16 22:48:44 瀏覽:588
php開發api介面 發布:2025-08-16 22:47:48 瀏覽:839
將ssd轉化為hdd的高速緩存 發布:2025-08-16 22:39:04 瀏覽:910
行程碼伺服器異常什麼時候能好 發布:2025-08-16 22:38:58 瀏覽:517