将问题与C ++静态库链接起来

时间:2014-06-26 22:34:30

标签: c++ linker static-libraries

我有2个静态库,我正在构建一个链接这两个库的可执行文件。这段代码编译/运行正常,直到我将Crc函数从library2移动到library1。在library1中我定义了一个函数

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);
}

当我链接可执行文件时,我得到一个&#34;未定义的引用`Crc16&#39;。我的链接是

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具有标记为undefined的函数是有意义的。没有意义的是,在链接可执行文件时,它会抱怨函数未定义。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:2)

由于library2依赖于library1,因此需要首先在链接行中列出它。颠倒顺序,你应该好好去。