2012-08-02 35 views
0

function.cpp寫入未定義參照功能 - >它被編譯成function.o,然後libFunction.so克++鏈接錯誤:當功能名稱使用#

#define PASTEHELPER(a,b) a ## b 

#define PASTE(a,b) PASTEHELPER(a,b) 

void PASTE(My,Function)() { .... } 

主。 cpp - >編譯爲main.o.但鏈接時出錯

void MyFunction(); 

鏈接g ++中的錯誤。 (但是,在Visual Studio中成功)

g++ -mtune=i686 -MP -MMD -MT .o -Wextra -Woverloaded-virtual -Wno-sign-compare -Wno-conversion -Wno-missing-field-initializers -O3 -DNDEBUG -fno-strict-aliasing -fPIC -fdiagnostics-show-option -DPROJECT=MyProjec -o /mypath main.o -L.. -L/sbcimp/run/pd/gcc/32-bit/4.4.2/lib/gcc/i686-pc-linux-gnu/4.4.2 -L/sbcimp/run/pd/gcc/32-bit/4.4.2/lib -lFunction -pthread -L/sbcimp/run/pd/python/2.7.1/lib -lpython2.7 -l util -L/sbcimp/run/pd/boost/32-bit/1.47.0_gcc4.4.2/lib -lboost_filesystem -lboost_thread -lboost_regex -lboost_system -Wl,-rpath,/sbcimp/run/pd/boost/32-bit/1.47.0_gcc4.4.2/lib -L/sbcimp/run/pd/apache_xerces-c/32-bit/3.1.1_mt_gcc4.4.2/lib -lxerces-c -Wl,-rpath,/sbcimp/run/pd/apache_xerces-c/32-bit/3.1.1_mt_gcc4.4.2/lib -ldl -Wl,-z,origin -Wl,-rpath,'$ORIGIN' -Wl,-rpath,/sbcimp/run/pd/gcc/32-bit/4.4.2/lib/gcc/i686-pc-linux-gnu/4.4.2,-rpath,/sbcimp/run/pd/gcc/32-bit/4.4.2/lib,-soname,MyProject 


main.cpp: undefined reference to 'MyFunction'. 

函數未在任何.h文件中定義。這是問題嗎?如果需要在.h中聲明函數,怎麼寫呢?

+1

你真的編譯'function.cpp'作爲你在g ++版本中的一部分嗎?另外,爲什麼你的文章說'鏈接器錯誤報告在'.h'文件中?通常在'.cpp'文件中報告Liker錯誤。你如何在g ++中編譯你的文件? – AnT 2012-08-02 02:02:09

+0

安德雷,我糾正了我的問題。 – Cammie 2012-08-02 03:17:26

+2

宏的使用(相當奇怪)是令人困惑的問題。你可以在你的問題中修改代碼,以便'function.cpp'直接定義'MyFunction',而不使用任何宏(假設它仍然存在問題)?此外,錯誤消息引用'function.h',但是您沒有向我們顯示該文件或任何'#include'指令。如果您可以向我們展示*完整的*自成一體的代碼,以及您使用的確切的g ++命令和錯誤消息,我們可以幫助您更好地完成任務。 – 2012-08-02 03:26:19

回答

0

我不確定粘貼的鏈接器錯誤是否完整。

但無論如何,如果鏈接器真的抱怨MyFunction,那麼它期望符號MyFunction是C,而不是C++(在C++中它應該抱怨MyFunction())。

所以我猜你要麼宣佈void MyFunction();extern "C"或者你實際上使用的gcc代替main.cpp編譯main.cmain.o

你可以檢查你在圖書館和你的鏈接器運行預計:

objdump -t function.o |grep MyFunction 
objdump -t main.o |grep MyFunction 

如果您編譯從.cpp文件,這兩個文件的.o,你應該得到像_Z10MyFunctionv符號名。兩者的符號名稱應該相同。 但是,如果其中一個沒有損壞(即只是MyFunction),那麼它來自C而不是C++。

如果它們都被破壞,但不同,那麼您在兩種情況下都會聲明函數不同。使用#define不應該影響鏈接器。

+0

我添加了一個聲明「void MyFunction();」在function.h中解決了這個問題。 – Cammie 2012-08-07 05:21:06