91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c/c++靜態庫之間如何相互調用

發布時間:2022-08-11 09:45:30 來源:億速云 閱讀:297 作者:iii 欄目:開發技術

這篇“c/c++靜態庫之間如何相互調用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“c/c++靜態庫之間如何相互調用”文章吧。

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

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

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

c/c++靜態庫之間如何相互調用

c/c++靜態庫之間如何相互調用

2.打包成靜態庫

c/c++靜態庫之間如何相互調用

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

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

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

c/c++靜態庫之間如何相互調用

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

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

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.設置附加庫和附屬關系

c/c++靜態庫之間如何相互調用

將靜態庫中的debug目錄的路徑復制到附加庫目錄中

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

到此準備工作就完成了 接下來有兩種方法可以實現c++項目調用c靜態庫

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

接著往下看:

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

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

格式:

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

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

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

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

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

c/c++靜態庫之間如何相互調用

右擊項目名稱 點擊屬性 再更改配置類型為靜態庫類型

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

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

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

c++ 的文件中天然包含 __cplusplus 標識符 而c是沒有的 可以以此為入口點 通過條件編譯使得extern “C” 在c++項目中展開 但是在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 拷貝那段關于括號匹配的代碼到其中 包含靜態庫的頭文件 添加打包的cpp動態庫到附加庫目錄 設置依賴項 通過調用cpp靜態庫里的棧的函數解決 運行成功就說明c項目鏈接c++的靜態庫成功

2.建立c項目

c/c++靜態庫之間如何相互調用

3.包含靜態庫的頭文件

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

c/c++靜態庫之間如何相互調用

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

c/c++靜態庫之間如何相互調用

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

以上就是關于“c/c++靜態庫之間如何相互調用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

白河县| 饶河县| 万山特区| 琼中| 五峰| 吉隆县| 桓仁| 凤庆县| 望江县| 贡嘎县| 新密市| 元江| 余庆县| 霍林郭勒市| 马鞍山市| 喜德县| 正宁县| 临清市| 平南县| 临夏市| 巍山| 卢龙县| 宿松县| 铜陵市| 邵阳市| 延津县| 邵武市| 临西县| 河津市| 辛集市| 奎屯市| 开远市| 余干县| 枣强县| 科技| 开封县| 彩票| 台山市| 房产| 饶平县| 温宿县|