2013-08-20 50 views
0

我有一個C++函數,我想從Python調用。該函數本身非常簡單,但它涉及只能在C++中完成的IPC調用。爲了編譯C++代碼,需要鏈接大量的其他庫。我試圖用SWIG來實現這一點。我有一個Makefile文件,看起來像這樣:將SWIG包裝與其他庫鏈接

all: swig object shared 

object: swig 
    ${CC} -c ${MODULE}_wrap.cxx ${INCLUDES} 

shared: 
    ${CC} -Wl,--verbose -shared ${MODULE}_wrap.o -o _${MODULE}.so 

swig: 
    ${SWIG} -c++ -python ${MODULE}.i 

有了這個,一切編譯罰款,但後來我的導入模塊中的Python給了我「未定義的符號」錯誤。如果我改變shared行:

shared: 
    ${CC} -Wl,--verbose -shared ${MODULE}_wrap.o -o _${MODULE}.so ${LIBS} 

它失敗collect2: ld returned 1 exit status編譯,但並沒有告訴我的錯誤是什麼。詳細的鏈接器輸出有大量的行,表示「試圖打開[某些庫]失敗」,但少數這些行說「成功」。難道只有那些說失敗的人阻止了鏈接的發生?我試圖用SWIG模塊做甚麼?

回答

1

是的,這是可能的。您需要確保在Python加載模塊時解析包裝的C/C++模塊所依賴的共享庫。使用ldd檢查庫(Swig生成)以查看它依賴的庫。最好爲鏈接模塊設置rpath(運行時路徑;類似於:gcc的-rpath=/path/to/your/libs)以指向這些庫的位置。或者,您可以在運行Python之前適當地設置LD_LIBRARY_PATH

+0

我不能在SWIG生成的庫上執行'ldd',因爲它只是一個目標文件。但我仍然嘗試過。 '-rpath ='不起作用,但我試過'-Xlinker -rpath -Xlinker [path]'。我也嘗試過'LD_LIBRARY_PATH'。我仍然收到未定義的符號錯誤。我覺得我失去了一些明顯的東西。 – sagargp