vs2010能調用c11編譯的庫嗎
『壹』 vs2010有沒有實現C++11的多線程庫
沒有。 VS2012才可以使用C++線程支持庫。
『貳』 如何在VS2010中運行編譯C和C++
在從基礎語言上去說:
1、原則上,VS主要面對win進行開發,VS2010支持C++語言。
2、C++語言環境原理上兼容C。
3、針對win進行的編程的C++一般都能移植到VS2010中,但一般來說,直接打開不同版本的VC++的工程並不能確定都能順利編譯,需要根據實際情況進行轉換、調整。低版本的VS一般打不開高版本VS生成的工程。跨版本太大的一般不能自動轉換,比如用VS2010去打開VC6.0生成的工程。
4、C語言編程一般都是很早期的代碼,很多針對DOS設計,所以,在VS2010中很多代碼是運行不過的,而且所使用的庫文件、函數名、定義都有很多不同,所以,想要順利編譯通過,多數情況下很難,需要做大量的修正。當然,如果只是一些練習和教學性的代碼,懂的人稍作修改,也可以在VS2010下進行測試與練習,不過DOS與WIN,在編程上有很大差別,基本上不是一回事。
『叄』 vs2010工程為什麼不能調用vs2012生成的庫
考慮是不是用了vs2010不支持的函數?
2.考慮是不是代碼採用的是共享方式編出來的動態庫?
如果是第一種情況,改成vs2010支持的函數即可。
如果是第二種情況,改成靜態方式編譯出動態庫或者在別人的機器中裝你機器上的分發包。
***************************************************************************************
如果你認可我的回答,
請及時點擊【採納為滿意回答】按鈕,(或在客戶端右上角評價點【滿意】)
你的採納,
是我前進的動力! 你的採納也會給你帶去財富值的。
如有不明白,
『肆』 VS的那個版本支持C11特性
最新版的編譯器基本都支持C++11,比如codeblocks 13.12.0.0,dev c++ 5.0 beta 9.2 (4.9.9.2), vs2008,vs2010,vs2013等等。
不過這些編譯器一般默認是不開啟c++11的,需要你在編譯器設置裡面勾選C++11或者C++0x
設置就拿codeblocks舉例。
project->build options望採納
『伍』 vs2017編譯出來的lib和dll,vs2010下使用可以嗎
如果是.net,只要框架版本一致就可以,如果是C++,通常要相應的運行庫
『陸』 vs2010 裡面 運行時庫不同的庫能放在一個程序里調用么(比如兩個庫分別是MTd 跟MDd)
不能。
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
You are trying to link with incompatible libraries.ImportantThe run-time libraries now contain directives to prevent mixing different types. You』ll receive this warning if you try to use different types or debug and non-debug versions of the run-time library in the same program. For example, if you compiled one file to use one kind of run-time library and another file to use another kind (for example, single-threaded versus multithreaded) and tried to link them, you』ll get this warning. You should compile all source files to use the same run-time library.
總之,一句話,lib之間有沖突。需要刪除導入的一些libs。
VC編譯選項多線程(/MT)
多線程調試(/MTd)
多線程DLL(/MD)
多線程調試DLL(/MDd)
C運行時庫庫文件
Singlethread(staticlink)MLlibc.lib
Debugsinglethread(staticlink)MLdlibcd.lib
MultiThread(staticlink)MTlibcmt.lib
DebugmultiThread(staticlink)MTdlibcmtd.lib
MultiThread(dynamiclink)MDmsvert.lib
DebugmultiThread(dynamiclink)MDdmsvertd.lib
3.各種C運行時庫的區別
(1)靜態鏈接的單線程庫
靜態鏈接的單線程庫只能用於單線程的應用程序,C運行時庫的目標代碼最終被編譯在應用程序的二進制文件中。通過/ML編譯選項可以設置VisualC++使用靜態鏈接的單線
程庫。
(2)靜態鏈接的多線程庫
靜態鏈接的多線程庫的目標代碼也最終被編譯在應用程序的二進制文件中,但是它可以在多線程程序中使用。通過/MT編譯選項可以設置VisualC++使用靜態鏈接的多線程庫。
(3)動態鏈接的運行時庫
動態鏈接的運行時庫將所有的C庫函數保存在一個單獨的動態鏈接庫MSVCRTxx.DLL中,MSVCRTxx.DLL處理了多線程問題。使用/MD編譯選項可以設置VisualC++使用動態
鏈接的運行時庫。
/MDd、/MLd或/MTd選項使用Debugruntimelibrary(調試版本的運行時刻函數庫),與/MD、/ML或/MT分別對應。Debug版本的RuntimeLibrary包含了調試信息
,並採用了一些保護機制以幫助發現錯誤,加強了對錯誤的檢測,因此在運行性能方面比不上Release版本。
下面是msdn關於VisualC++編譯器選項的說明:
這些選項選擇單線程或多線程運行時常式,指示多線程模塊是否為DLL,並選擇運行時庫的發布版本或調試版本。
選項說明
/MD定義_MT和_DLL以便同時從標准.h文件中選擇運行時常式的多線程特定版本和DLL特定版本。此選項還使編譯器將庫名MSVCRT.lib放入.obj文件中。
用此選項編譯的應用程序靜態鏈接到MSVCRT.lib。該庫提供允許鏈接器解析外部引用的代碼層。實際工作代碼包含在MSVCR71.DLL中,該庫必須在運行時對於與MSVCRT.lib鏈
接的應用程序可用。
當在定義了_STATIC_CPPLIB(/D_STATIC_CPPLIB)的情況下使用/MD時,它將導致應用程序通過靜態多線程標准C++庫(libcpmt.lib)而非動態版本(msvcprt.lib)進行鏈接
,同時仍通過msvcrt.lib動態鏈接到主CRT。
/MDd定義_DEBUG、_MT和_DLL,以便從標准.h文件中選擇運行時常式的調試多線程特定版本和DLL特定版本。它還使編譯器將庫名MSVCRTD.lib放入.obj文件中。
/ML使編譯器將庫名LIBC.lib放入.obj文件中,以便鏈接器使用LIBC.lib解析外部符號。這是編譯器的默認操作。LIBC.lib不提供多線程支持。
/MLd定義_DEBUG並使編譯器將庫名LIBCD.lib放入.obj文件中,以便鏈接器使用LIBCD.lib解析外部符號。LIBCD.lib不提供多線程支持。
/MT定義_MT,以便從標准頭(.h)文件中選擇運行時常式的多線程特定版本。此選項還使編譯器將庫名LIBCMT.lib放入.obj文件中,以便鏈接器使用LIBCMT.lib解析
外部符號。創建多線程程序需要/MT或/MD(或它們的調試等效選項/MTd或/MDd)。
/MTd定義_DEBUG和_MT。定義_MT會導致從標准.h文件中選擇運行時常式的多線程特定版本。此選項還使編譯器將庫名LIBCMTD.lib放入.obj文件中,以便鏈接器使
用LIBCMTD.lib解析外部符號。創建多線程程序需要/MTd或/MDd(或它們的非調試等效選項/MT或MD)。
/LD創建DLL。
將/DLL選項傳遞到鏈接器。鏈接器查找DllMain函數,但並不需要該函數。如果沒有編寫DllMain函數,鏈接器將插入返回TRUE的DllMain函數。
鏈接DLL啟動代碼。
如果命令行上未指定導出(.exp)文件,則創建導入庫(.lib);將導入庫鏈接到調用您的DLL的應用程序。
將/Fe解釋為命名DLL而不是.exe文件;默認程序名成為基名稱.dll而不是基名稱.exe。
如果還未顯式指定/M選項之一,則將默認運行時庫支持更改為/MT。
/LDd創建調試DLL。定義_DEBUG。
警告不要混合使用運行時庫的靜態版本和動態版本。在一個進程中有多個運行時庫副本會導致問題,因為副本中的靜態數據不與其他副本共享。鏈接器禁止在.exe文件內
部既使用靜態版本又使用動態版本鏈接,但您仍可以使用運行時庫的兩個(或更多)副本。例如,當與用動態(DLL)版本的運行時庫鏈接的.exe文件一起使用時,用靜態(非
DLL)版本的運行時庫鏈接的動態鏈接庫可能導致問題。(還應該避免在一個進程中混合使用這些庫的調試版本和非調試版本)。
『柒』 Code::Blocks 用mingw gcc編譯出來的動態鏈接庫dll 在VS2010中可以調用 會不會出錯,有相關的介紹嗎
給你兩點建議:
dll的導出介面(數據或函數)使用C調用約定並且以c編譯器編譯(而不是c++)
使用com技術
『捌』 vs2010中 可以直接編譯運行cpp文件嗎
是的
vc6裡面許多沒有規范要求的,後面的版本規范了很多!不放項目里,不能運行的
『玖』 VS2010的MFC程序如何調用動態庫文件(dll文件)放在system32中仍然編譯無法打開d
dll這個東西,只要放到編譯時會去訪問的任意路徑上即可。
比如你現在是Debug,你可以放到Debug文件夾或者工程文件夾;
你現在是Release, 你可以放到Release文件夾或者工程文件放到System32無法訪問可能說明你的程序根本不需要去訪問System32,雖然這不太可能。
當然我可以認為樓主是在隱式調用dll, 顯示調用失敗系統不會報錯。如果 你是要隱式調用已經知道庫在何處和其中函數定義的dll,可以在你的FingerMatch.cpp開始的時候寫上:
#ifdef _DEBUG
#pragma comment(lib, "..(路徑)fp.lib")
#else
#pragma comment(lib, "..(路徑)fp.lib")
#endif
然後包含一下fp.h,這個應該是已經做了。那應該不會有什麼問題了。
值得注意的是編譯時dll只會打開一次,比如你在Debug文件夾下有一個fp.dll,在工程文件夾下也有一個fp.dll,那麼編譯時使用的是Debug文件夾下的dll,因為它先被找到。
如果上面說的都沒用,那麼你顯式調用吧
『拾』 vs2010編譯c的dll,在c++中調用問題
樓上說的很對,我在用java NDK 開發也是這樣的問題,但是一樣是用extern "C" 搞定,
貼段代碼給你看看
#include<jni.h>
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<android/log.h>
extern"C"
{
voidJava_com_example_jniopengl_MainActivity_go(JNIEnv*env,jobjectthiz);
}
void*run_by_thread(void*num)
{
int*nums=(int*)num;
intstatus=0;
for(inti=0;i<3;i++)
{
::sleep(1);
::__android_log_print(1,"go++","thread%d:_%d",*nums,i);
}
if(*nums==1)
{status=100;
return(void*)&status;
}
elseif(*nums==2)
{
status=200;
::pthread_exit((void*)&status);
}}
voidstart_threads()
{
pthread_tth1,th2;
intthreadNum1=1;
intthreadNum2=2;
intret=-1;
intre=::pthread_create(&th1,NULL,run_by_thread,(void*)&threadNum1);
re=::pthread_create(&th2,NULL,run_by_thread,(void*)&threadNum2);
void*status;
re=::pthread_join(th1,&status);
int*code=(int*)status;
__android_log_print(1,"code","code:%d ",*code);
re=::pthread_join(th2,&status);
int*code2=(int*)status;
__android_log_print(1,"code","code:%d ",*code2);
}
voidJava_com_example_jniopengl_MainActivity_go(JNIEnv*env,jobjectthiz)
{
start_threads();
}