簡體   English   中英

將C庫與C ++鏈接

[英]Linking C libraries with a C++

我創建了一個dll文件。 該文件編譯為C代碼。 我想在一個新項目中使用這個dll文件。 這個新項目是一個C ++項目。 如果我編譯我的新項目,一切都很好但是當項目編譯為C ++程序時,它為從dll文件導出的函數提供了未解決的外部符號錯誤。 我希望我的新項目是一個C ++程序,但想要鏈接一個編譯為C程序的庫。 我正在使用Visual Studio 2010.有什么幫助嗎?

另一個方法是更改​​C頭文件以檢查是否正在由cpp編譯器編譯並有條件地包含extern“C”:

#ifdef __cplusplus 
extern "C" {
#endif

void func1(int a, int b);
//... other functions

#ifdef __cplusplus
}
#endif

您需要在導入過程的頭文件聲明中使用extern "C" ,以便使用C鏈接。

目前正在發生的事情是C ++編譯器期望導入函數的名稱損壞。 使用extern "C"關閉C ++名稱修改。

例如:

extern "C"
{
    int Func1(int a, int b);
    void Func2(double a);
}

由於您可以控制頭文件,因此將extern "C"放在頭文件中會更有意義。 這意味着任何使用頭文件的人都不需要關心這些問題。 但是,當包含您無法控制的頭文件時,@ Nawaz的建議是一種靈活的方式。

我也忘了提到@bcsanches的優點,即extern "C"是C ++而不是C.因此,如果你想讓一個頭文件同時適用於C和C ++,它需要有條件地包括在內。

將C頭添加到C ++項目時執行此操作:

extern "C"
{
   #include "cheader.h" //C header 
}

這可以防止C ++編譯器對cheader.h定義的名稱進行名稱cheader.h

您甚至可以將命名空間定義為:

namespace cproject
{
    extern "C"
    {
       #include "cheader.h" //C header 
    }    
}

如果這樣做,那么當你引用cheader.h定義的名稱時,你必須用cproject::限定每個名稱(函數,變量,結構)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM