vs2010编译c的dll,在c++中调用问题

在vs2010,建立一个win32项目的默认dll工程,并把相关的.cpp文件改为.c文件后,编译可以成功但是建立一个MFC单文档项目(c++项目),再调用这个dll中的... 在vs2010,建立一个win32项目的默认dll工程,并把相关的.cpp文件改为.c文件后,
编译可以成功
但是建立一个MFC单文档项目(c++项目),再调用这个dll中的测试函数,链接时报错:
error LNK2019: 无法解析的外部符号 "int __cdecl mytest(void)" (?mytest@@YAHXZ)
(工程属性中的 调用约定 都是为 __cdecl (/Gd), 且已经包含了.lib库文件)
将dll工程中的 .c文件再改名回 .cpp就可以编译成功, 请问是怎么回事呢?
而由于需要移植的开源代码都是.c文件,所以要建一个c的dll,需要怎么解决这个问题?
展开
 我来答
匿名用户
推荐于2016-06-19
展开全部
那是因为,如果源文件是c的话,默认所有导出函数都隐含加了extern "C"的属性

你在CPP里使用那些函数,应该需要在声明里加上extern "c"属性的,否则链接器会按CPP方式去查找函数,这当然是找不到的

按理说开源工程一般都会做得比较细心才对啊,你看一下它的头文件,一般在开头都会有类似下面的代码,包括windows的头文件,全部都会有的

#ifdef __cplusplus
extern "C" {
#endif

xxxxxx函数声明

#ifdef __cplusplus
}
#endif

出现你那种情况,大概是函数的声明是你自己把函数名复制过去的吧,没有用开源工程提供的头文件;

解决也简单,如果开源工程有提供头文件,那么就用它提供的头文件;如果没有,那么在你声明的地方加上我上面的代码
437384801
2013-11-25 · TA获得超过1867个赞
知道小有建树答主
回答量:1299
采纳率:0%
帮助的人:511万
展开全部

楼上说的很对,我在用java NDK 开发也是这样的问题,但是一样是用extern "C" 搞定,

贴段代码给你看看

#include <jni.h>
#include<stdio.h>
#include <pthread.h>
#include   <unistd.h>
#include <android/log.h>
extern "C"
{

void Java_com_example_jniopengl_MainActivity_go(JNIEnv* env,jobject thiz);


}

void *run_by_thread(void *num)
{
int *nums=(int*)num;
int status=0;
for(int i=0;i<3;i++)
{
::sleep(1);
::__android_log_print(1,"go++","thread %d:_%d",*nums,i);
}

if(*nums==1)
{ status=100;
return (void*)&status;
}
else if(*nums==2)
{
status=200;

::pthread_exit((void*)&status);
}



}
void start_threads()
{
pthread_t th1,th2;
int threadNum1=1;
int threadNum2=2;
int ret=-1;
int re=::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\n",*code);

re=::pthread_join(th2,&status);
int *code2=(int *)status;
__android_log_print(1,"code","code:%d\n",*code2);

}

void Java_com_example_jniopengl_MainActivity_go(JNIEnv* env,jobject thiz)
{


start_threads();


}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式