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,需要怎么解决这个问题? 展开
编译可以成功
但是建立一个MFC单文档项目(c++项目),再调用这个dll中的测试函数,链接时报错:
error LNK2019: 无法解析的外部符号 "int __cdecl mytest(void)" (?mytest@@YAHXZ)
(工程属性中的 调用约定 都是为 __cdecl (/Gd), 且已经包含了.lib库文件)
将dll工程中的 .c文件再改名回 .cpp就可以编译成功, 请问是怎么回事呢?
而由于需要移植的开源代码都是.c文件,所以要建一个c的dll,需要怎么解决这个问题? 展开
2个回答
推荐于2016-06-19
展开全部
那是因为,如果源文件是c的话,默认所有导出函数都隐含加了extern "C"的属性
你在CPP里使用那些函数,应该需要在声明里加上extern "c"属性的,否则链接器会按CPP方式去查找函数,这当然是找不到的
按理说开源工程一般都会做得比较细心才对啊,你看一下它的头文件,一般在开头都会有类似下面的代码,包括windows的头文件,全部都会有的
#ifdef __cplusplus
extern "C" {
#endif
xxxxxx函数声明
#ifdef __cplusplus
}
#endif
出现你那种情况,大概是函数的声明是你自己把函数名复制过去的吧,没有用开源工程提供的头文件;
解决也简单,如果开源工程有提供头文件,那么就用它提供的头文件;如果没有,那么在你声明的地方加上我上面的代码
你在CPP里使用那些函数,应该需要在声明里加上extern "c"属性的,否则链接器会按CPP方式去查找函数,这当然是找不到的
按理说开源工程一般都会做得比较细心才对啊,你看一下它的头文件,一般在开头都会有类似下面的代码,包括windows的头文件,全部都会有的
#ifdef __cplusplus
extern "C" {
#endif
xxxxxx函数声明
#ifdef __cplusplus
}
#endif
出现你那种情况,大概是函数的声明是你自己把函数名复制过去的吧,没有用开源工程提供的头文件;
解决也简单,如果开源工程有提供头文件,那么就用它提供的头文件;如果没有,那么在你声明的地方加上我上面的代码
展开全部
楼上说的很对,我在用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();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询