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();
}