欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c/c++靜態(tài)庫(kù)之間相互調(diào)用的實(shí)戰(zhàn)案例

 更新時(shí)間:2022年08月10日 16:36:54   作者:*insist  
C++調(diào)用C的函數(shù)比較簡(jiǎn)單,直接使用extern "C" {}告訴編譯器用C的規(guī)則去編譯C代碼就可以了,下面這篇文章主要給大家介紹了關(guān)于c/c++靜態(tài)庫(kù)之間相互調(diào)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

本文主要介紹c語(yǔ)言寫(xiě)的項(xiàng)目如何調(diào)用c++實(shí)現(xiàn)的庫(kù)和c++如何調(diào)用c語(yǔ)言實(shí)現(xiàn)的庫(kù)

一、c++項(xiàng)目如何調(diào)用c的庫(kù)(以靜態(tài)庫(kù)為例)

??示例:建立一個(gè)項(xiàng)目Stack_c.lib,將該項(xiàng)目中的棧的實(shí)現(xiàn)的代碼打包為一個(gè)靜態(tài)庫(kù),再建立另一個(gè)c++的項(xiàng)目,并調(diào)用打包好的c實(shí)現(xiàn)的靜態(tài)庫(kù)里的棧的相關(guān)函數(shù)

1.將棧的源文件和頭文件拷貝一份到Stack_c.lib這個(gè)項(xiàng)目的路徑下

2.打包成靜態(tài)庫(kù)

??應(yīng)用好之后就點(diǎn)擊生成解決方案 ,之后就會(huì)生成一個(gè)Stack_c.lib的靜態(tài)庫(kù)了 (與項(xiàng)目名重名了,問(wèn)題不大 不要在意)

生成后我們可以點(diǎn)開(kāi)項(xiàng)目的所在目錄下 找到debug目錄 可以看到里面多了一個(gè)Stack_c.lib的靜態(tài)庫(kù)文件 表示打包成功!

??至此,靜態(tài)庫(kù)就打包好了,當(dāng)然是編譯器幫我們打包的,后續(xù)會(huì)更新如何自己親手打包一個(gè)庫(kù)(動(dòng)靜態(tài)庫(kù)的知識(shí))!

3.建立一個(gè)c++項(xiàng)目(TestStacklib) 引入c項(xiàng)目中的頭文件

??注意:這里的引入頭文件的路徑可以是相對(duì)路徑 其中是代表的上級(jí)目錄 只需找到自己創(chuàng)建的動(dòng)態(tài)庫(kù)的頭文件的路徑并在新建的c++項(xiàng)目中包含即可

本文中的test.cpp是一段關(guān)于括號(hào)匹配的算法代碼 可以用建的靜態(tài)庫(kù)里的棧的特性來(lái)解決

bool isValid(const char* s) {
    const char* cur = s;
    stack stack;
    StackInit(&stack);
    while (*cur != '\0')
    {
        if (*cur == '(' || *cur == '{' || *cur == '[')//如果是左括號(hào)就進(jìn)棧
        {
            StackPush(&stack, *cur);
        }
        else
        {
            if (StackEmpty(&stack))//考慮到開(kāi)始是右括號(hào),那么就是棧為空,就不可能有效,直接返回FALSE
            {
                return false;
            }
            char top = StackTop(&stack);
            if (*cur == ')' && top == '(' || *cur == '}' && top == '{' || *cur == ']' && top == '[')
            {
                StackPop(&stack);
            }
            else {
                return false;
            }
        }
        cur++;
    }
    if (StackEmpty(&stack))//有可能只有一個(gè)左括號(hào),進(jìn)棧就沒(méi)了,有效還有判斷棧是否為空,為空才是有效括號(hào)
        return true;
    else
        return false;

}

int main()
{
    cout << isValid("{{))") << endl;
    cout << isValid("({})") << endl;
    return 0;
}

4.設(shè)置附加庫(kù)和附屬關(guān)系

將靜態(tài)庫(kù)中的debug目錄的路徑復(fù)制到附加庫(kù)目錄中

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-uwjKkcKk-1657719900201)(C:\Users\華哥\AppData\Roaming\Typora\typora-user-images\image-20220713195455905.jpg)]

到這里附加庫(kù)目錄的操作就完成了 接下來(lái)就是在輸入中設(shè)置依賴項(xiàng)了

??到此準(zhǔn)備工作就完成了 接下來(lái)有兩種方法可以實(shí)現(xiàn)c++項(xiàng)目調(diào)用c靜態(tài)庫(kù)

1.將stack_c.lib中的stack.c的后綴改成stack.cpp 即可
2.在c++項(xiàng)目中使用extern “C” 表示編譯的時(shí)候按照c的規(guī)則編譯鏈接(主要就是函數(shù)名修飾的規(guī)則用c的規(guī)則)因?yàn)閏++是兼容c的所以c++的編譯器可以這么干 反過(guò)來(lái)c是不可以兼容c++的 所以反過(guò)來(lái)是行不通的。

接著往下看:

??第一種方法:將Stack_c.lib中的stack.c 改名為 stack.cpp(使得其編譯鏈接的時(shí)候是按照c++的規(guī)則,這樣c++項(xiàng)目調(diào)c++規(guī)則生成的庫(kù)就可以理所當(dāng)然的調(diào)動(dòng)了,但是這樣的方式似乎很不著調(diào),本來(lái)是c庫(kù),但是硬是把里面的源文件的后綴改成了cpp 不太好)

然后運(yùn)行那段代碼就可以成功運(yùn)行了 證明調(diào)用靜態(tài)庫(kù)成功!

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-Og8Njbtu-1657719900202)(C:\Users\華哥\AppData\Roaming\Typora\typora-user-images\image-20220713201637750.jpg)]

??第二種:利用extern "C"改變c++項(xiàng)目的編譯鏈接過(guò)程的規(guī)則由c++的規(guī)則變成c的規(guī)則,這樣再調(diào)用c的靜態(tài)庫(kù)也就可以實(shí)現(xiàn)了,而且不用像第一種方法一樣去改源文件的后綴(強(qiáng)盜行為)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BYdV4ZeG-1657719900202)(C:\Users\華哥\AppData\Roaming\Typora\typora-user-images\image-20220713202155357.jpg)]

格式:

extern "C"
{
	#include"庫(kù)的頭文件路徑"
}

之后就可以運(yùn)行成功 ,表示鏈接成功了!就不貼圖了 與上面的圖一樣

二、c項(xiàng)目如何調(diào)用c++的庫(kù)(靜態(tài)庫(kù)為例)

還是那句話,c++兼容c 要用c項(xiàng)目調(diào)用c++庫(kù) 那么就只能是讓c++ 的庫(kù)編譯的時(shí)候用c的規(guī)則來(lái),那么該咋弄呢?
還是extern “C”

1.建立c++項(xiàng)目(Stack_cpp) 并且將棧的源文件和頭文件包含在該目錄 將其打包為cpp的靜態(tài)庫(kù)

??右擊項(xiàng)目名稱 點(diǎn)擊屬性 再更改配置類型為靜態(tài)庫(kù)類型

??之后點(diǎn)擊到項(xiàng)目的路徑 進(jìn)入debug目錄 看到生成了一個(gè)Stack_cpp.lib 就說(shuō)明生成打包靜態(tài)庫(kù)成功了!

接下來(lái)就是用extern "C"結(jié)合條件編譯來(lái)使得c++項(xiàng)目中的代碼按照c的規(guī)則來(lái)編譯鏈接 但是c項(xiàng)目要包含c++靜態(tài)庫(kù)的頭文件 那么就會(huì)在預(yù)處理的時(shí)候頭文件展開(kāi) 那么c項(xiàng)目中就也會(huì)有 extern “C” 這是不可以的 只有c++才可以識(shí)別extern “C” c是識(shí)別不了的 會(huì)報(bào)錯(cuò)?。。?/p>

那么如何解決 ? 條件編譯這個(gè)時(shí)候就派上大用處了

??c++ 的文件中天然包含 __cplusplus 標(biāo)識(shí)符 而c是沒(méi)有的 可以以此為入口點(diǎn) 通過(guò)條件編譯使得extern “C” 在c++項(xiàng)目中展開(kāi) 但是在c項(xiàng)目中不展開(kāi) 就將問(wèn)題解決了

下面還有一個(gè)簡(jiǎn)化版的條件編譯

//簡(jiǎn)化版
#ifdef __cplusplus
extern "C"
{
#endif

 void StackInit(stack* pst);
 void StackDestory(stack* pst);
 void StackPush(stack* pst,STDataType x);
 void StackPop(stack* pst);
 bool StackEmpty(stack* pst);
 int StackSize(stack* pst);
 STDataType StackTop(stack* pst);

#ifdef __cplusplus
}
#endif

之后就是 建立c項(xiàng)目 然后 建立test.c 拷貝那段關(guān)于括號(hào)匹配的代碼到其中 包含靜態(tài)庫(kù)的頭文件 添加打包的cpp動(dòng)態(tài)庫(kù)到附加庫(kù)目錄 設(shè)置依賴項(xiàng) 通過(guò)調(diào)用cpp靜態(tài)庫(kù)里的棧的函數(shù)解決 運(yùn)行成功就說(shuō)明c項(xiàng)目鏈接c++的靜態(tài)庫(kù)成功

2.建立c項(xiàng)目

3.包含靜態(tài)庫(kù)的頭文件

4 .添加打包的cpp動(dòng)態(tài)庫(kù)到附加庫(kù)目錄 設(shè)置依賴項(xiàng)

然后就大功告成了 ,如果沒(méi)有差錯(cuò)就可以直接運(yùn)行成功了。

??這里需要注意的是 要記得使用靜態(tài)庫(kù)前完成了準(zhǔn)備工作后一定要生成解決方案后再在來(lái)調(diào)用庫(kù)!

總結(jié)

到此這篇關(guān)于c/c++靜態(tài)庫(kù)之間相互調(diào)用的文章就介紹到這了,更多相關(guān)c/c++靜態(tài)庫(kù)間相互調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論