使用C和C++绑定链接到库

Link To Library with C and C++ Bindings

本文关键字:链接 绑定 C++ 使用      更新时间:2023-10-16

我正在尝试确定是否可以针对具有c和c++绑定的linux库进行链接。我有一个现有的c++项目,它被分解为几个库。我想用C绑定来扩展这些库,这样我就可以将它们与cgo一起使用。

我知道如何将c/c++与外部"c"语法混合使用。我遇到的问题是菊花链库。我创建了一个示例项目来演示我的问题:

https://github.com/Shelnutt2/c_cpp_linker_test

在这个项目中,我们有hello.c和world.cpp,它们都构建在一个名为libwords的库中。我可以毫无问题地将libwords链接到libhelloworld。当试图构建main.cpp时,就会出现问题,它想要从libhelloworld(以及链接的libwords)调用c和c++函数

由于C++与C的链接差异,主可执行文件无法找到hello函数

main.cpp:15: undefined reference to `hello'

有可能以这种方式链接到同一个库吗?或者我需要将c绑定分解为它们自己的包装器库吗?

在这个示例项目中,我使用了共享库,但如果可能的话,我对静态链接持开放态度。

您应该将应用程序与这两个库链接起来。导出是不可传递的。

main: main.o libhelloworld.so
$(CXX) $< -L'$(CURDIR)' -lwords -lhelloworld -o $@

> gmake
c++ -Wall -g -O -fPIC -DC_LINK_TEST=1   -c -o helloworld.o helloworld.cpp
cc -Wall -g -O -fPIC -DC_LINK_TEST=1   -c -o hello.o hello.c
c++ -Wall -g -O -fPIC -DC_LINK_TEST=1   -c -o world.o world.cpp
c++ -Wall -g -O -fPIC -DC_LINK_TEST=1    -shared hello.o world.o -o libwords.so
c++ -Wall -g -O -fPIC -DC_LINK_TEST=1    -L'/usr/home/me/c_cpp_linker_test' -lwords -shared helloworld.o libwords.so -o libhelloworld.so
c++ -Wall -g -O -fPIC -DC_LINK_TEST=1   -c -o main.o main.cpp
#c++ main.o libhelloworld.so -o main
c++ main.o -L'/usr/home/me/c_cpp_linker_test' -lwords -lhelloworld -o main
> LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd` ./main
c gives us: hello
cpp gives us: hello world
>

否则,链接C和C++调用约定就没有问题,因为名称篡改是不同的。

(不要介意将g++更改为c++-我使用clang)