1

我有一個基本的共享庫我建立用於實踐,並且所有它定義爲在建立共享庫,但未定義的函數引用?

int placeholder() { return 1; } 

形式功能佔位符我建立它像這樣,在生成文件的libtool爲了便於(相關部分) :

libfootest: $(OBJECTS) 
    libtool --mode=link $(CC) -g -O -o libfootest.la $(OBJECTS)\ 
      -rpath /usr/lib 

libfootest.o: $(SRCDIR)/$(SOURCES) 
    libtool --mode=compile $(CC) -c $(SRCDIR)/$(SOURCES) 

install: libfootest 
    libtool --mode=install cp libfootest.la /usr/lib/libfootest.la 

現在我可以驗證)它安裝與適當.so.*.la,b)nm具有在各個libtool的對象中定義的符號placeholder(libfootest.o連接)之前,相信是所有我需要的。

我那麼現在正在創建用於測試目的的程序,

#include "../includes/libfootest.h" //public prototypes are here 
int main() { 
    int test = placeholder(); 
    return 0; 
} 

而像-lfootest和鏈接它的發現,但不幸的是我得到一個未定義的引用錯誤佔位符!

/tmp/cc92NtSa.o: In function `main': 
prototypes.cxx:(.text+0x19): undefined reference to `placeholder()' 

你能發現我在這做錯了什麼,或者是否有某種出口我必須爲圖書館工作?我看到一些apis在它們的函數聲明之前使用了DLLEXPORT或類似函數,但我不確定它們的功能。

+0

你的'readelf -Wa libfootest.so | grep placeholder'輸出是什麼? – aponomarenko 2011-03-30 06:49:11

+0

@開發人員:不幸的是,在它的函數名稱沒有結果,並且完整的輸出似乎沒有提供很多線索。必須有一些「可見性」功能來解決這個問題。 – 2011-03-30 06:53:04

回答

1

prototypes.cxxC++模式,這引起了參考placeholder()收購C++名連鎖(並獲得mangled)編譯的。

如果您打算placeholder()是來自CC++可調用的,你必須建立在C++模式下添加extern "C"聯動,它的原型:

#ifdef __cplusplus 
extern "C" 
#endif 
int placeholder(); 

如果你打算placeholder()僅是可用從C++,然後使用CXX而不是CC構建庫。

相關問題