2017-01-17 103 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)