C++/C联合编程

经常需要使用C++编码,同时有时候会需要用到C。直接编译C程序为动态库链接通常是没法正常工作的。如下:
实现c程序的add.h:

#ifndef ADD_H_H
#define ADD_H_H
int add(int a, int b);
#endif

add.c实现文件:

#include "add.h"
int add(int a, int b) { return a + b; }

将代码编译为动态库:
clang add.c -fPIC -shared -o libadd.so
可以在本地查看到动态库libadd.so,主程序main.cpp

#include "add.h"
#include <iostream>
using namespace std;
int main() { cout << add(1, 2) << endl; }

编译主程序,同时将动态库链接到主程序:
clang++ main.cpp -L. -I. -ladd -o main。输出如下:

/usr/bin/ld: /tmp/main-e56874.o: in function `main':
main.cpp:(.text+0x13): undefined reference to `add(int, int)'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)

修改头文件支持c:

#ifndef ADD_H_H
#define ADD_H_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif

链接成功。
Makefile文件:

C = clang
CXX = clang++
SOURCE_C = add.c
LIBRARY_C = add.o
SOURCE_CXX = main.cpp
TARGET = main
LDFLAGS_COMMON = -std=c++2a
all:
        $(C) -fPIC -shared ${SOURCE_C} -o $(LIBRARY_C)
        ${CXX} ${SOURCE_CXX} ${SOURCE_C} -o $(TARGET)

clean:
        rm -rf *.so ${TARGET}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值