我有一個混合的C/C++庫。爲什麼我不能使用gcc鏈接具有C接口的混合C/C++靜態庫?
在外部,它使用extern C提供一個C接口。內部有模板和類。使用「ar」創建庫沒有任何問題。該文件被稱爲libo-client.a。
然而,用gcc鏈接.a
文件(不是G ++)的時候,我有很多的錯誤,看起來像這樣:
libo-client.a(mysocket.o):(.rodata._ZTV7mStream[vtable for mStream]+0x10): undefined reference to `__cxa_pure_virtual'
...
mysocket.cpp:(.text+0x15ad): undefined reference to `operator new[](unsigned long)'
mysocket.cpp:(.text+0x15c1): undefined reference to `operator delete(void*)'
mysocket.cpp:(.text+0x167a): undefined reference to `__cxa_allocate_exception'
mysocket.cpp:(.text+0x16a6): undefined reference to `__cxa_throw'
...
我的編譯/鏈接行看起來是這樣的:
gcc $(CFLAGS) $(INCLUDES) test2.c libo-client.a -o test2
test2是我的測試工具。
當我使用g ++時,不會發生此問題。但是,我將把這個庫連接到用gcc編譯的C項目中。我如何解決這個問題?這是什麼原因?
編輯:
即使我沒有使用C++標準庫這顯然需要一些東西像運營商新/刪除等,並有例外內部。
我把這個東西與Xen hypervisor連接起來,所以我不確定我有什麼選擇,但要完全重寫這個東西,或者試着用G ++編譯Xen。
使它成爲一個動態庫也可能有所幫助。你有沒有看過那個? –
謝謝克里斯。這實際上是一個動態共享對象。 – Matt