C和C++混合编译

作者: 没事造轮子 | 来源:发表于2017-01-05 13:38 被阅读0次

1. 背景

为了工作需要,在抽离一个开源库组件的时候,编译成功链接却失败,查找原因发现测试文件使用的是C++语言,而库的组件使用的是C语言,具体原因记录与此。

2. 现场

为了测试,写了一个单独的简单案例:

新建win32工程,建立三个文件,分别是test.ctest.hmain.cpp

main.cpp

#include "test.h"

int main()
{
    test(1);
    return 0;
}

test.h

#ifndef _TEST_H_
#define _TEST_H_

void test(int a);

#endif

test.c

#include "test.h"

void test(int a)
{

}

编译运行:

编译结果

3. 原因

编译成功,链接失败,很显然代码中已经实现了test函数,为了查找原因,直接打开vs命令行工具查看一下编译后的符号表都有什么。

进入Debug目录,执行dumpbin /SYMBOLS test.obj

test.c 符号表

答案很显然,编译test.c生成的符号是_test,而现在要找的是void __cdecl test(int)" (?test@@YAXH@Z),结果当然是无法找到的。

为了进一步确认答案,将test.c改为test.cpp,重新编译,查看符号表。

test.cpp 符号表

对于C语言生成的符号表和C++语言生成的符号表差距很大,原因无非是C++支持了很多新的功能,原来的符号表生成规则已经无法满足。

例如:重载、多态等机制。

为了解决这个问题,C++语言引入了另一种语法来解决这个问题。

C++标准文档语法描述

4. 结论

对于C语言编写的程序来说,未来可能被C语言或者C++语言的用户所使用,大部分解决的方法是:

#ifdef __cplusplus
extern "C" {
#endif

// ...

#ifdef __cplusplus
}
#endif

直接在C语言中使用extern "C"会报语法错误,因为该语法是C++语法,对于C语言来说,声明该接口是C语言编写的显然没有任何意义,它的目标是使用C++语言的用户;而对于C++用户,该声明却是必须的,因为C和C++语言编写的函数的符号表生成结果是不一致的,除非你在编译C文件的时候明确用C++编译器,那就没什么问题了。

原文:http://wangzhechao.com/che-c-hun-he-bian-yi/

相关文章

  • invalid argument '-std=c++11' no

    c和c++在c++11 通过cmake混合编译报错如下 解决方法: 指定需要c++11的code编译为

  • C和C++混合编译

    1. 背景 为了工作需要,在抽离一个开源库组件的时候,编译成功链接却失败,查找原因发现测试文件使用的是C++语言,...

  • C++项目中的extern "C" {}

    C++项目中的extern "C"参考文献主要用于c++和c的混合编程中,在需要用c的代码的时候按照c的编译器进行...

  • C/C++与MATLAB混合编程

    C/C++与MATLAB混合编程笔记 1. 简介 C/C++和MATLAB之间的混合编程可以是:C/C++编程的过...

  • iOS面试题(选择简答)

    选择题 1、在Xcode中,需要编译混合Objective-C和C++的源码文件,需要将文件格式的后缀改为 (C)...

  • Objective-C++

    苹果的Objective-C编译器允许你在同一个源文件中混合使用C++和Objective-C,这种Objecti...

  • 2018-08-16 Linux系统基础及安全

    基本技能。开发语言:编译型语言:C/C++;解释型语言:Perl、Ruby、JavaScript;混合型:Java...

  • 浅谈C/C++混合编程

    首先, 在介绍C/C++混合编程之前, 先思考几个问题 1. C/C++混合编程是什么? 2. C/C++混合编程...

  • 学习cmake

    c++与fortran混合编程时的cmake 在fortran和c++混合编程时,使用cmake工具参考link[...

  • 命令行编译C++/C文件

    编译C文件用GCC 编译C++文件(包括.C/C++文件)用G++ 编译C++文件常用方法: 单个文件: g++ ...

网友评论

    本文标题:C和C++混合编译

    本文链接:https://www.haomeiwen.com/subject/prlzvttx.html