我創建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的庫?是否有任何問題需要注意?
_「這意味着我可以使用C++編寫庫,並且只要我提供C API,那麼C和C++調用程序都可以使用我的庫?」_是_「這是普遍適用的嗎?」_是_「這應該始終有效嗎?「_是_」爲什麼它能工作?「因爲C++包含了所有的C語言。無論如何,你的問題太過寬泛。 – 2014-08-30 15:58:13
請注意,在頭文件中使用'void init(void)'等。在C中,空括號表示編譯器不需要檢查是否使用正確數量的參數來調用它(並且在這種情況下不能)。例如。 'init(5)'會編譯(但運行時可能會崩潰)。 – mafso 2014-08-30 16:05:22
@mafso:我不認爲在標準C中是這樣的。我認爲他們採用C++的方式來做到這一點。 – Puppy 2014-08-30 16:33:09