C/C++联合编程

294 阅读1分钟

经常需要使用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}