可能有点长,因为我也不知道我哪一步出错了,所以尽量多写一点信息:

之前完全没有做过 C++,因为项目需求临时看了下 C++和 Qt 的资料开始做东西;
之前电脑里装了 Viusal Studio 2022 ,所以电脑上是 2022 版本的 MSVC 组件,然后 Qt 在版本选型的时候考虑用的是 5.12.12 。这个版本安装包带的 MSVC 的库还是 2017 版本的,但是实际原生开发没有遇到问题,可以正常编译运行。

接下来有一个要解析展示 LaTeX 表达式的需求,找了下 GitHub 上有一个 JKQtPlotter 项目满足我的需求。按照我的理解,把 GitHub 上的库 clone 到本地,然后按照说明文档用 CMake 编译

```shelll
cmake -G "Visual Studio 17 2022" "-DCMAKE_PREFIX_PATH=D:\Qt\Qt5.12.12\5.12.12\msvc2017_64"  ..
cmake --build . --config "Debug"
cmake --install . --config "Debug"
```

然后在 Qt Creator 里添加库,选择编译生成好又安装完成的.lib 文件,实际在 Qt Creator 写代码的时候也能正常给出这个库的代码提示。

但是编译无法通过,提示找不到函数……

我怀疑可能是编译器不匹配的问题,所以用 VS 安装工具单独安装了 MSVC2017 的生成器,但是安装完成过后 Qt Creator 依然是找不到 MSVC2017 ,CMake 的参数传-G "Visual Studio 15 2017"同样报错说找不到。

所以想请问一下这些操作步骤大概是哪里的问题?应该怎么去解决比较好?

之前只做过 C#和前端的项目,Nuget 和 npm 确实方便,甚至偶尔写过一点 Python 都有 pip ,相比之下 C++用起第三方库感觉真的好麻烦……
举报· 292 次点击
登录 注册 站外分享
16 条回复  
snylonue 小成 2024-5-16 11:48:17
@guyeu 最近就在试用 conan (windows),qt 装不上,fltk 装完以后 cmake 找不到
Nosub 小成 2024-5-15 09:13:45
建议用 vcpkg ,大部分第三库都有,不过要配合 vs 门槛更低,花点时间学习下 vcpkg ,如果要更进一步,需要学习下 cmake 脚本语言,学习 C++就是这样,库管理乱的一塌糊涂,c++ 20 才引入 Module ,只能等时间积累,你要对比 Maven 或是 npm ,只能说 c++还有很长的路要走,不过大部分项目,也会提供库的使用方法,无非是你现在不懂 cmake ;
ysc3839 小成 2024-5-15 02:42:12
@liuhai233 NuGet 要配合 MSBuild 使用,配合 CMake 的话会麻烦很多,而且 NuGet 源里第三方 C++ 库可能没那么多。个人只建议写 Windows 程序、不跨平台的情况下使用。
liuhai233 小成 2024-5-15 01:26:47
也能用 nuget
https://devblogs.microsoft.com/cppblog/nuget-for-c/
424778940 小成 2024-5-14 23:41:24
推荐使用 msys2 套装, 然后 qt 项目不要用 qmake 工程, 而是使用 cmake 工程
我一般就算在 win 上, 除非一定要用 msvc 的场景, 比如要用 nv 的 cuda, 否则一律 msys2 的 mingw 工具链, 这样的代码移植到 linux 和其他平台特别方便, 基本不需要改什么, 另外 msvc 总喜欢定义一些名字很怪的宏这点我不太喜欢
tr1v1z 小成 2024-5-14 23:34:15
没有用 xmake 的吗
guyeu 小成 2024-5-14 23:25:57
Conan 可解你忧
chouxw112233 小成 2024-5-14 23:05:21
试了下,没有问题
编译的库:
https://github.com/jkriege2/JKQtPlotter/releases/tag/v4.0.3

我的环境:
Qt Creator 12.0.2
Based on Qt 6.6.0 (MSVC 2019, x86_64)


testjkqtp.pro
```
LIBS += -LD:\Qt\pj\build-JKQtPlotterBuildAllExamples-Desktop_Qt_6_6_3_MinGW_64_bit-Debug\qmake\staticlib\jkqtplotterlib\debug -ljkqtplotterlib_debug
INCLUDEPATH += D:\Qt\pj\JKQtPlotter-4.0.3\lib
```


mainwindow.cpp
```
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    plot = new JKQTPlotter(true, this);
}

MainWindow::~MainWindow()
{
    delete ui;
    delete plot;
}
```

hpp
```
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QElapsedTimer>
#include <QCheckBox>
#include <QLineEdit>
#include <QTimer>
#include <QImage>
#include <QVBoxLayout>
#include <QWidget>
#include <QTabWidget>
#include <QFormLayout>
#include <QCheckBox>
#include "jkqtplotter/jkqtplotter.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    JKQTPlotter* plot;
};
#endif // MAINWINDOW_H

```

效果
![123123]( https://img2.imgtp.com/2024/05/14/CMZCRxcq.jpg)
cnbatch 初学 2024-5-14 22:57:15
做 C++(以及 C 开发)需要严格区分以下种类:
32 位与 64 位
debug 与 release
动态库与静态库

从你给出的编译命令来看,是编译出 x64 debug 版本,至于是动态库还是静态库我就不去挖掘了。
然后在 qt creator 内用的是哪一种组合?这也是要注意的,如果能够贴出具体的报错提示和设置,那么大家可以更容易帮你给出编译设置步骤
listenerri 小成 2024-5-14 22:33:46
要先明确是找不到函数的声明,还是找不到函数的定义( IDE 能补全不一定代表编译系统也能正常)

前者的话是因为第三方库的头文件没有添加进编译器搜索范围中,后者的话是因为找不到静态库或动态库文件,一般是因为库文件所在目录不在编译器/链接器搜索范围中,或是没有明确写出要链接第三方库
12下一页
返回顶部