2017-01-17 64 views
1

我想,以确定是否有可能对一个linux库,C和C++绑定链接。我有一个现有的C++项目被分解成几个库。我想用C绑定扩展这些库,以便我可以在cgo中使用它们。链接到库C和C++绑定

我知道++与外部的“C”语法如何搭配C/C。我有的问题是菊花链式库。我创建这说明我的问题的示例项目:

https://github.com/Shelnutt2/c_cpp_linker_test

在这个项目中,我们有hello.c中,world.cpp这两者都内置到库调用libwords。我可以将libwords链接到libhelloworld,而不会出现问题。尝试构建main.cpp时出现问题,该main.cpp想从libhelloworld调用ac和C++函数(因此也是链接的libwords)

由于C++与C的链接不同,主可执行程序无法找到hello函数

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

是否有可能以这种方式对同一库链接或者我需要打破C绑定到自己的包装库?

在我使用的共享库示例项目,但我开到静态链接,如果这是可能的。

+0

没有语言的C/C++。由于显而易见的原因,C不支持'extern“C”'。不清楚你想完成什么。看[问]并提供[mcve]。 – Olaf

+0

@Olaf'语言'C/C++是C和C++的交集。 FWIW,ANSI C89几乎是C++的真正子集,在ANSI C89的K&R书中,所有示例都使用C++编译器进行编译。 –

+0

@ErikAlapää:这简直是无稽之谈! 1)C是C11,ANSI-C早已不复存在。离开身体埋藏。 2)对于C++来说是相同的,这是C++ 14(主要用C++ 11转换)。 3)相同的语法不意味着相同的语义试试'static const int i = 5; int a [i];'在两个类似的'auto int i = 5,a [i];'中。 4)告诉C++是C的超集的人不知道这两种语言中的至少一种不足以写出比“Hello World”更多的语言;至少没有任何生产代码。 – Olaf

回答

1

你应该与这两个库链接应用程序。出口不是传递性的。

main: main.o libhelloworld.so 
    $(CXX) $< -L'$(CURDIR)' -lwords -lhelloworld -o [email protected] 


> 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)