2014-06-26 127 views
0

我有2個靜態庫,並且我構建了一個鏈接這兩個庫的可執行文件。此代碼編譯/運行良好,直到我將Crc函數從library2移至library1。在LIBRARY1我已經定義了一個函數與C++靜態庫鏈接問題

uint16_t Crc16(const std::vector<uint8_t> &data); 

在library2我有一個函數

uint16_t MyClass::CalcChecksum() 
{ 
    std::vector<uint8_t> payload(rawData.begin()+1, rawData.end()-FOOTER_SIZE); 
    return Crc16(payload); 
} 

當我聯繫,我得到一個「未定義的參考`CRC16' 的可執行文件。我的鏈接線是

g++ -rdynamic -Wl,-rpath,/home/chris/Qt5.3.0/5.3/gcc_64 -Wl,-rpath,/home/chris/Qt5.3.0/5.3/gcc_64/lib -o MyExecutable main.o server.o client.o service.o userserver.o pluginloader.o plugin.o moc_server.o moc_client.o moc_userserver.o moc_pluginloader.o moc_plugin.o -L/home/chris/Dev/ProductName/build-ProductName-Desktop_Qt_5_3_0_GCC_64bit-Debug/MyExecutable/../StaticLibrary1/ -lStaticLibrary1 -L/home/chris/Dev/ProductName/build-ProductName-Desktop_Qt_5_3_0_GCC_64bit-Debug/MyExecutable/../StaticLibrary2/ -lStaticLibrary2 -ldl -L/home/chris/Qt5.3.0/5.3/gcc_64/lib -lQt5Network -lQt5Core -lpthread 

當我檢查libray1出口我得到這個:

nm lib1.a | grep -i crc 
000000000000041d T Crc16 

和LIB2我得到這個:

nm lib2.a | grep -i crc 
       U Crc16 

實際的錯誤,我得到的是

/home/chris/Dev/ProductName/build-ProductName-Desktop_Qt_5_3_0_GCC_64bit-Debug/MyExecutable/../StaticLibrary2//libStaticLibrary2.a(message.o): In function `Device::Message::CalcChecksum()': 
/home/chris/Dev/ProductName/ProductName/StaticLibrary2/message.cpp:392: undefined reference to `Crc16' 

是LIBRARY1具有定義的功能,library2具有的功能標記爲未定義有意義的事實。沒有任何意義的是,當鏈接一個可執行文件時,它會抱怨函數未定義。

謝謝, 克里斯

回答

2

由於library2取決於LIBRARY1,它需要首先上市的連接線。顛倒順序,你應該很好去。

+0

Brillant!太糟糕了,我沒有想到這一點!感謝幫助。 – Chris