在使用C++开发程序时,有时使用到别人开发的第三方库,而这第三库是使用C开发的。直接使用会报错如下:

cpp error LNK2019: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),函数 main 中引用了该符号

源码

// main.cpp

#include<iostream>

using namespace std;

int sum(int v, int d);
int detal(int v, int d); int main()
{ cout << sum(2, 3) << endl;
cout << detal(15, 5) << endl;
return 0;
}

第三方库测试文件

// math.c

int sum(int v, int d)
{
return v + d;
} int detal(int v, int d)
{
return v - d;
}

如果直接在cpp文件使用c文件的方法,会报错。

对这种情况,可以使用extern "C"的方式

解释:告诉编译器使用C的方式编译,但如果C也调用了extern "C" 修饰的方法也会报错

解决:定义与申明分离,将声明写入.h文件中,定义在.c文件中

同时使用宏对使用这第三方库的c++文件增加extern "C"。

补充:宏 __cplusplus

每一个cpp前面都定义了这个宏,只是没显示出来

// math.h

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
int sum(int v, int d);
int detal(int v, int d);
#ifdef __cplusplus
}
#endif // __cplusplus

最新文章

  1. java并发:简单面试问题集锦
  2. JS事件委托的原理和应用
  3. (WCF) WCF Service Hosting.
  4. sql中在查询时两列合并为一列
  5. JS操作JSON总结(转)
  6. Truck History(kruskal+prime)
  7. 几个BCB例子
  8. HashSet 与HashMap底层实现
  9. (六十一)Xcode的git版本控制
  10. java基础 关于转换流
  11. cocos creator 无法打开项目 dock栏只显示图标问题解决方法
  12. MyBatis-Plus 3.0.3 Sql注入器添加,即全局配置Sql注入器,sqlInjector改写
  13. 十八、springcloud(四)熔断器
  14. Linux下apache activemq的安装与配置
  15. elastic5.4安装错误解决
  16. SQL高效查询两个表不同的数据
  17. ubuntu16.04下部署tomcat9和java8启动一次需要七八分钟
  18. Unity 4.x 资源加载
  19. 玩转Javascript 给JS写测试
  20. js梳理

热门文章

  1. KingbaseES V8R6 账号异常登录锁定案例
  2. 理解 Spring IoC 容器
  3. Docker 环境 Nacos2 MySQL8
  4. Redux(mvc、flux、react-redux)
  5. 使用mbr2gpt将MBR磁盘转换为GPT磁盘
  6. linux使用iptables屏蔽ip地址
  7. Python数据分析教程(二):Pandas
  8. Kafka开启SASL认证 【windowe详细版】
  9. Java SE 16 record 类型说明与使用
  10. Elasticsearch单字段支持的最大字符数