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

2024-11-03 01:24:17
推荐回答(2个)
回答1:

那是因为,如果源文件是c的话,默认所有导出函数都隐含加了extern "C"的属性

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

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

#ifdef __cplusplus
extern "C" {
#endif

xxxxxx函数声明

#ifdef __cplusplus
}
#endif

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

解决也简单,如果开源工程有提供头文件,那么就用它提供的头文件;如果没有,那么在你声明的地方加上我上面的代码

回答2:

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

贴段代码给你看看

#include 
#include
#include 
#include   
#include 
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();


}