2014-08-30 18 views
2

我創建Windows上的靜態庫使用Visual Studio 2008這兩個文件:爲什麼我可以在庫中使用C++代碼並從C程序調用。這是如何運作的?

頭文件是一個簡單的C API:

#ifdef __cplusplus 
extern "C" { 
#endif 

    void init(); 
    void stop(); 

#ifdef __cplusplus 
} 
#endif 

實施然而,使用C++的功能:

#include "my_lib_api.h" 

#include <iostream> 

void init() { 
    std::cout << "Initializing my_lib\n"; 
} 
void stop() { 
    std::cout << "stopping my_lib\n"; 
} 

然後我用這些命令構建:

mkdir Release 
cl.exe /O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_LIB" /FD /EHsc /MT /Gy /Fo"Release\\" /W3 /c /Zi /TP my_lib_api.cpp /nologo /errorReport:prompt 
lib.exe /OUT:my_lib_api.lib /LTCG .\Release\my_lib_api.obj /NOLOGO 

然後我複製my_lib_api.lib和my_lib_api.h到哪裏創建了一個帶有的main.c源文件中的新的Visual Studio控制檯應用程序的新文件夾:

#include "my_lib_api.h" 

int main(int argc, char* argv[]) { 
    init(); 

    stop(); 
    return 0; 
} 

我建立使用相同/ MT多線程C運行時圖書館與圖書館保持一致。然後,它建成像這樣:

mkdir Release 
cl.exe /O2 /Oi /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /MT /Gy /Fo"Release\\" /W3 /c /Zi /TC .\main.c /nologo /errorReport:prompt 

成功創建它運行得很好發佈/ main.obj

link.exe /OUT:c_api_so.exe /INCREMENTAL:NO /MANIFEST:NO /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 my_lib_api.lib kernel32.lib user32.lib shell32.lib .\Release\main.obj /NOLOGO /ERRORREPORT:PROMPT 

成功創建c_api_so.exe。

這意味着我可以用C++編寫一個庫,只要我提供一個C API,那麼C和C++調用程序都可以使用我的庫?這是普遍真實的嗎?這應該始終有效嗎?它爲什麼有效?我假設對於每個平臺,您只會說支持一個編譯器/鏈接器,並在Windows上提供基於Visual Studio的庫和Linux上的基於GNU C的庫?是否有任何問題需要注意?

+1

_「這意味着我可以使用C++編寫庫,並且只要我提供C API,那麼C和C++調用程序都可以使用我的庫?」_是_「這是普遍適用的嗎?」_是_「這應該始終有效嗎?「_是_」爲什麼它能工作?「因爲C++包含了所有的C語言。無論如何,你的問題太過寬泛。 – 2014-08-30 15:58:13

+0

請注意,在頭文件中使用'void init(void)'等。在C中,空括號表示編譯器不需要檢查是否使用正確數量的參數來調用它(並且在這種情況下不能)。例如。 'init(5)'會編譯(但運行時可能會崩潰)。 – mafso 2014-08-30 16:05:22

+0

@mafso:我不認爲在標準C中是這樣的。我認爲他們採用C++的方式來做到這一點。 – Puppy 2014-08-30 16:33:09

回答

4

廣義上說,函數就是一個接口。所有來電者關心的是它符合該接口。實施是完全不相關的。在這種情況下,通過使用extern "C",您告訴C++編譯器創建C編譯器可以使用的二進制接口。接口是一個匹配(由標準保證),所以你可以很安全地從C中調用它。只是爲了重新聲明,這個體在這裏是完全不重要的,並且可以以任何語言實現。 許多語言提供定義可以從C

被調用的函數稍微更具體的權力,不是由標準規定的C ABI(ABI是這裏的二進制接口的名稱),但幾乎所有的操作系統具有定義的C ABI,該平​​臺上的每個人都使用該C ABI。這是C仍然是編程的「通用語言」的主要原因 - 幾乎每個人都可以在二進制級別上講C語言。

相關問題