[Help].C文件如何调用.CPP文件中的函数?

时间:2022-09-30 16:35:36
test.c文件调用convert.cpp文件中的函数,提示无法识别该函数
新建一个空的控制台程序,然后分别加入convert.h,convert.cpp,test.c三个文件.

//convert.h
extern void testPrint();

//convert.cpp
#include <stdio.h>
#include "convert.h"

void testPrint()
{
    printf("Enter testPrint\n");
}

//test.c
#include <stdio.h>
#include "convert.h"

int main()
{
//调用该函数,提示错误如下:
//error LNK2001: unresolved external symbol _testPrint
testPrint();
    
system ("pause");
}

11 个解决方案

#1


//调用该函数,提示错误如下:
//error LNK2001: unresolved external symbol _testPrinttestPrint();

#2


cpp 头文件声明该函数的时候用 extern "c" 修饰

#3



//convert.cpp
#include <stdio.h>
#include "convert.h"//去掉这里的看看

void testPrint()
{
    printf("Enter testPrint\n");
}

#4


把CPP源码相关的所有内容编译成LIB或者DLL。
然后头文件中的接口使用:extern "C" { /* 这里写声明 */ } 包围起来。
之后链接即可。

#5


在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。
如:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文件 cFile.c
/* 这样会编译出错:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 ); 
return 0;
}


#6


这里extern "C"用不起来

//convert.h
extern "C" void testPrint();

error C2059: syntax error : 'string'

#7


因为工程中.C文件和.CPP文件代码比较多,
所以想能不封装成DLL的话,尽量不封装.

如果不封装DLL的话,这个问题不知道是否好解决...

#8


这三个文件,是新建一个 空的控制台程序,
然后又加入的.

#9


引用 7 楼 hellobbbb_123456 的回复:
因为工程中.C文件和.CPP文件代码比较多,
所以想能不封装成DLL的话,尽量不封装.

如果不封装DLL的话,这个问题不知道是否好解决...

可以生成静态lib。
在.c文件中 引用头文件处用extern "c"包起来。

#10


引用 4 楼 loaden 的回复:
把CPP源码相关的所有内容编译成LIB或者DLL。
然后头文件中的接口使用:extern "C" { /* 这里写声明 */ } 包围起来。
之后链接即可。

++

#11


谢谢楼上各位朋友的提醒,问题已经解决.

//convert.h
extern "C" void testPrint();

//convert.cpp
#include <stdio.h>
#include "convert.h"

void testPrint()
{
 printf("Enter testPrint\n");
}

//test.c
#include <stdio.h>
#include <windows.h>
//#include "convert.h" //引用该头文件会出错!!!

extern void testPrint();

int main()
{
testPrint();
system ("pause");

return 0;
}

#1


//调用该函数,提示错误如下:
//error LNK2001: unresolved external symbol _testPrinttestPrint();

#2


cpp 头文件声明该函数的时候用 extern "c" 修饰

#3



//convert.cpp
#include <stdio.h>
#include "convert.h"//去掉这里的看看

void testPrint()
{
    printf("Enter testPrint\n");
}

#4


把CPP源码相关的所有内容编译成LIB或者DLL。
然后头文件中的接口使用:extern "C" { /* 这里写声明 */ } 包围起来。
之后链接即可。

#5


在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。
如:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文件 cFile.c
/* 这样会编译出错:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 ); 
return 0;
}


#6


这里extern "C"用不起来

//convert.h
extern "C" void testPrint();

error C2059: syntax error : 'string'

#7


因为工程中.C文件和.CPP文件代码比较多,
所以想能不封装成DLL的话,尽量不封装.

如果不封装DLL的话,这个问题不知道是否好解决...

#8


这三个文件,是新建一个 空的控制台程序,
然后又加入的.

#9


引用 7 楼 hellobbbb_123456 的回复:
因为工程中.C文件和.CPP文件代码比较多,
所以想能不封装成DLL的话,尽量不封装.

如果不封装DLL的话,这个问题不知道是否好解决...

可以生成静态lib。
在.c文件中 引用头文件处用extern "c"包起来。

#10


引用 4 楼 loaden 的回复:
把CPP源码相关的所有内容编译成LIB或者DLL。
然后头文件中的接口使用:extern "C" { /* 这里写声明 */ } 包围起来。
之后链接即可。

++

#11


谢谢楼上各位朋友的提醒,问题已经解决.

//convert.h
extern "C" void testPrint();

//convert.cpp
#include <stdio.h>
#include "convert.h"

void testPrint()
{
 printf("Enter testPrint\n");
}

//test.c
#include <stdio.h>
#include <windows.h>
//#include "convert.h" //引用该头文件会出错!!!

extern void testPrint();

int main()
{
testPrint();
system ("pause");

return 0;
}