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

时间:2017-01-17 13:25:41

标签: c++ c gcc linker g++

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

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

https://github.com/Shelnutt2/c_cpp_linker_test

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

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

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

是否可以以这种方式链接同一个库,还是需要将c-bindings分解为自己的包装库?

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

1 个答案:

答案 0 :(得分:1)

您应该将您的应用程序与两个库链接。出口不具有传递性。

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)