QT 未定义对 3rd 方库的引用

Posted

技术标签:

【中文标题】QT 未定义对 3rd 方库的引用【英文标题】:QT has undefined reference to 3rd party library 【发布时间】:2015-08-13 03:52:01 【问题描述】:

目前我正在学习使用一个名为“triceps”的库。我在linux平台上使用qt-creator,编译器是clang。

错误信息是

/home/developer/Projects/trytriceps/main.cpp:11: error: undefined reference to `Triceps::Unit::Unit(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)'

我的 .pro 文件是这样的。

QT       += core

QT       -= gui

TARGET = trytriceps
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

LIBS += -stdlib=libc++
INCLUDEPATH += /home/developer/Projects/triceps-2.0.1/cpp
# This path contains libtriceps.a and libtriceps.so.
LIBS += -L/home/developer/Projects/triceps-2.0.1/cpp/build
LIBS += -ltriceps

QMAKE_CXXFLAGS += -stdlib=libc++
QMAKE_CXXFLAGS += -std=c++11

我的 main.cpp 文件是

#include <iostream>
#include <utest/Utest.h>
#include <sched/Unit.h>
using namespace std;

int main()

    cout << "hello world" << endl;

    Autoref<Unit> hwunit = new Unit("my unit");

    cout << hwunit->getName() << endl;

    return 0;

我尝试以这种方式链接到 boost_regex 库,它可以工作。谁能帮我?谢谢。

【问题讨论】:

你可以试试快速 ldd libtriceps.so 看看是否缺少某些库链接? @BertrandMartel 什么是“ldd libtriceps.so”?谢谢! 打开一个控制台,进入您的 libtriceps.so 目录并输入 ldd libtriceps.so(ldd 将打印此库的共享库) @BertrandMartel 我试过这个命令。似乎所有的依赖都存在。 我下载了库并构建了它,但是由于未定义的引用使测试失败。您的 make 测试是否也失败了? 【参考方案1】:

原来是构建问题(即使make test 仍然失败),我不再有未定义的错误。您的项目文件也可以正常工作。

如果你还有问题,这里是我建立的共享和静态库:

libtriceps.zip(包含所有cpp目录) https://mega.co.nz/#!wENQUQoK!LIbeVH8gB94oS-zBrIlGHQ0iAICiRW6dOx620AInh0o

如果您仍然有问题,请确保您已经完成了良好的清理,并使用 qmake 重新生成一个新的 Makefile

【讨论】:

结果是 .a 和 .so 出现新错误:-1:错误:在搜索 -ltriceps 时跳过不兼容的 /home/developer/Projects/cpp/build/libtriceps.so跨度> 其实我是在 libc++ 下开发,使用 clang++ 作为编译器。我是否需要将编译器更改为 gcc 而不是使用 libc++?有关系吗?谢谢! 我不知道我的 lib 是 32 位架构,也许这就是它失败的原因,我将尝试在另一台 64 位计算机上构建 我在 64 位上编辑了构建。您的项目在 64 位上运行良好,尽管我没有使用 stdlib=libc++ 或 -std=c++11 标志进行测试 谢谢!我发现我的开发环境有问题。在我切换到纯 VM 后,一切都开始工作了。谢谢!

以上是关于QT 未定义对 3rd 方库的引用的主要内容,如果未能解决你的问题,请参考以下文章

在库的情况下对函数的未定义引用

使用 QT 时对构造函数的未定义引用 [重复]

使用 Qt 对 vtable 的未定义引用

qt5 未定义对 'QApplication::QApplication(int&, char**, int)' 的引用

qt:对“mysql_something@nr”的未定义引用

Qt 创建者未定义对 linux 中“class::function”的引用