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