我正在尝试确定是否可以使用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分解为自己的包装库?
在这个示例项目中,我使用了共享库,但如果可能的话,我可以使用静态链接。
答案 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)