经常需要使用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}
博客主要讲述了在C++编码中有时需用到C,直接编译C程序为动态库链接通常无法正常工作的情况。通过给出add.h、add.c等代码示例,展示了编译动态库、主程序及链接动态库的过程,最后通过修改头文件支持C实现了成功链接,还提及了Makefile文件。
3031

被折叠的 条评论
为什么被折叠?



