最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

本文主要介紹c語言寫的項目如何調用c++實現(xiàn)的庫和c++如何調用c語言實現(xiàn)的庫

一、c++項目如何調用c的庫(以靜態(tài)庫為例)

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

1.將棧的源文件和頭文件拷貝一份到Stack_c.lib這個項目的路徑下

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

??應用好之后就點擊生成解決方案 ,之后就會生成一個Stack_c.lib的靜態(tài)庫了 (與項目名重名了,問題不大 不要在意)

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

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

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

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

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

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

}

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

4.設置附加庫和附屬關系

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

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

到這里附加庫目錄的操作就完成了 接下來就是在輸入中設置依賴項了

??到此準備工作就完成了 接下來有兩種方法可以實現(xiàn)c++項目調用c靜態(tài)庫

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

接著往下看:

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

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

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

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

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

格式:

extern "C"
{
	#include"庫的頭文件路徑"
}

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

二、c項目如何調用c++的庫(靜態(tài)庫為例)

還是那句話,c++兼容c 要用c項目調用c++庫 那么就只能是讓c++ 的庫編譯的時候用c的規(guī)則來,那么該咋弄呢?
還是extern “C”

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

??右擊項目名稱 點擊屬性 再更改配置類型為靜態(tài)庫類型

??之后點擊到項目的路徑 進入debug目錄 看到生成了一個Stack_cpp.lib 就說明生成打包靜態(tài)庫成功了!

接下來就是用extern "C"結合條件編譯來使得c++項目中的代碼按照c的規(guī)則來編譯鏈接 但是c項目要包含c++靜態(tài)庫的頭文件 那么就會在預處理的時候頭文件展開 那么c項目中就也會有 extern “C” 這是不可以的 只有c++才可以識別extern “C” c是識別不了的 會報錯?。?!

那么如何解決 ? 條件編譯這個時候就派上大用處了

??c++ 的文件中天然包含 __cplusplus 標識符 而c是沒有的 可以以此為入口點 通過條件編譯使得extern “C” 在c++項目中展開 但是在c項目中不展開 就將問題解決了

下面還有一個簡化版的條件編譯

//簡化版
#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項目 然后 建立test.c 拷貝那段關于括號匹配的代碼到其中 包含靜態(tài)庫的頭文件 添加打包的cpp動態(tài)庫到附加庫目錄 設置依賴項 通過調用cpp靜態(tài)庫里的棧的函數(shù)解決 運行成功就說明c項目鏈接c++的靜態(tài)庫成功

2.建立c項目

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

4 .添加打包的cpp動態(tài)庫到附加庫目錄 設置依賴項

然后就大功告成了 ,如果沒有差錯就可以直接運行成功了。

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

總結

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

相關文章

  • C++中常量與指針的示例詳解

    C++中常量與指針的示例詳解

    在C++學習使用過程中,每個人都不可避免地使用指針,而且都或多或少的接觸過常量指針或指針常量,但是對這兩個的概念還是很容易搞糊涂的,所以這篇文章主要給大家介紹了關于C++中常量與指針的相關資料,需要的朋友可以參考下
    2021-06-06
  • C++list的模擬實現(xiàn)

    C++list的模擬實現(xiàn)

    list是數(shù)據(jù)結構中的鏈表,在C++的STL中,有l(wèi)ist的模板,STL中的list的結構是帶頭雙向循環(huán)鏈表,當然STL中還有一個forward_list的鏈表,這個鏈表是一個帶頭的單鏈表。為了更好的理解list,我們來對其進行模擬實現(xiàn)。,需要的朋友可以參考
    2023-04-04
  • C++中fork函數(shù)的使用及原理

    C++中fork函數(shù)的使用及原理

    這篇文章主要介紹了C++中fork函數(shù)的使用及原理,在C++中,fork函數(shù)用于創(chuàng)建一個新的進程稱為子進程,該進程與原始進程幾乎完全相同,需要的朋友可以參考下
    2023-05-05
  • 模擬鼠標事件的實現(xiàn)思路及代碼

    模擬鼠標事件的實現(xiàn)思路及代碼

    這篇文章主要介紹了模擬鼠標事件的實現(xiàn)思路及代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++私有繼承與EBO深入分析講解

    C++私有繼承與EBO深入分析講解

    這篇文章主要介紹了C++私有繼承,在私有繼承當中,基類的公有成員和保護成員都會成為派生類的私有成員。這意味著基類的方法都會被private關鍵字描述,我們可以在派生類中使用它,但類對象無法直接調用,下面來看看詳細內容吧
    2022-08-08
  • VC中SDK與MFC的區(qū)別淺析

    VC中SDK與MFC的區(qū)別淺析

    這篇文章主要介紹了VC中SDK與MFC的區(qū)別淺析,需要的朋友可以參考下
    2014-07-07
  • C++文件讀寫操作詳解

    C++文件讀寫操作詳解

    本文詳細講解了C++讀寫文件的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C++從匯編的視角審視對象的創(chuàng)建問題

    C++從匯編的視角審視對象的創(chuàng)建問題

    這篇文章主要介紹了C++從匯編的視角看對象的創(chuàng)建,從匯編的視角來看,調用構造器和調用 “返回對象” 的函數(shù)是一樣的,從匯編的角度來看,對象就是一堆數(shù)據(jù)的排列,比如說最普通的對象就是數(shù)據(jù)成員按照聲明順序直接排列,需要的朋友可以參考下
    2022-01-01
  • C++類和對象之封裝詳解

    C++類和對象之封裝詳解

    大家好,本篇文章主要講的是C++類和對象之封裝詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Qt繪制時鐘效果

    Qt繪制時鐘效果

    這篇文章主要為大家詳細介紹了Qt繪制時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論

西乌珠穆沁旗| 绩溪县| 古交市| 昆山市| 山东| 娄底市| 肃北| 东乡| 盐边县| 垦利县| 华蓥市| 屏山县| 驻马店市| 肇庆市| 靖西县| 松潘县| 马边| 乌拉特前旗| 三台县| 吉木萨尔县| 田东县| 平罗县| 甘南县| 汝州市| 大宁县| 罗城| 沙湾县| 新竹县| 临城县| 绥德县| 改则县| 赤水市| 南阳市| 岳阳市| 遂平县| 象山县| 镇平县| 青田县| 临沂市| 营山县| 哈巴河县|