cpp
// my_c_function.c
//
#include <stdio.h>
#include "my_c_function.h"
void print_hello_from_c() {
printf("Hello from C!\n");
}
cpp
// my_c_function.h
extern "C"
{
void print_hello_from_c();
}
cpp
// my_cpp_code.cpp
//
#include "my_c_function.h"
extern "C" {
void print_hello_from_c();
}
int main() {
print_hello_from_c(); // 调用C函数
return 0;
}
bash
g++ -o my_c_function.o -c my_c_function.c -I ./
g++ -o my_cpp_code.o -c my_cpp_code.cpp
g++ my_c_function.o my_cpp_code.o -o my_program
用g++ 编译时,如果my_c_function.h 里面有extern "C" 是c的编译方式, 调用如果不extern "C" 会编译失败
// my_c_function.h
print_hello_from_c
bash
hfu@CNSH-BLD1:~/program/cplusplus/extern_test$ objdump -t my_c_function.o
my_c_function.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 my_c_function.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 g F .text 0000000000000013 print_hello_from_c
0000000000000000 *UND* 0000000000000000 _GLOBAL_OFFSET_TABLE_
0000000000000000 *UND* 0000000000000000 puts
如果用 g++ 编译时,如果my_c_function.h 里面没有extern "C" 便是c++ 编译方式
cpp
// my_c_function.h
//extern "C"
//{
void print_hello_from_c();
//}
_Z18print_hello_from_cv
bash
hfu@CNSH-BLD1:~/program/cplusplus/extern_test$ objdump -t my_c_function.o
my_c_function.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 my_c_function.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 g F .text 0000000000000013 _Z18print_hello_from_cv
0000000000000000 *UND* 0000000000000000 _GLOBAL_OFFSET_TABLE_
0000000000000000 *UND* 0000000000000000 puts