在 C++ 的 Qt Creator 项目中使用 MuParser 的问题

问题描述 投票:0回答:1

我正在尝试将 MuParser 包含在我的 Qt Creator 项目中,但我已经努力了很长一段时间才能让它正常工作。

我现在所处的位置,无论出于何种原因,似乎无法在 MuParser 库中找到几个符号,而且我真的不知道该怎么办。有谁知道我想做什么来解决这个问题?

我从官方网站下载了源代码作为.zip文件。提取内容后,我在该文件夹中添加了一个“build”目录。在MSYS2 MINGW64中,我跑了

cd (path to muparser folder)/build
cmake .. -DENABLE_SAMPLES=ON -DENABLE_OPENMP=ON -DENABLE_WIDE_CHAR=OFF -DBUILD_SHARED_LIBS=OFF
make

来自构建目录。这产生了静态库“libmuparser.a”。

我将此文件以及标题添加到我的项目文件夹中,文件结构如下:

(Project File)->libs->muparser->lib->libmuparser.a
(Project File)->libs->muparser->include->(MuParser Header Files)

然后,在我的 .pro 文件中,我添加了

INCLUDEPATH += $$PWD/libs/muparser/include
LIBS += -L$$PWD/libs/muparser/lib -lmuparser

但是,当我尝试构建项目时,我收到以下错误消息:

collect2.exe:-1: error: ld returned 1 exit status
C:/Qt/Tools/mingw1120_64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: debug/main.o: in function `qMain(int, char**)':
C:/Qt/Tools/mingw1120_64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: debug/main.o: in function `mu::Parser::~Parser()':
collect2.exe: error: ld returned 1 exit status
C:\Users\Aidan Beecher\Desktop\Qt Projects\TestMuParser\main.cpp:16: error: undefined reference to `__imp__ZN2mu6ParserC1Ev'
:-1: error: C:\Users\Aidan Beecher\Desktop\Qt Projects\TestMuParser\build\Desktop_Qt_6_7_2_MinGW_64_bit-Debug/../../main.cpp:17: undefined reference to `__imp__ZN2mu10ParserBase9DefineVarERKNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEPd'
:-1: error: C:\Users\Aidan Beecher\Desktop\Qt Projects\TestMuParser\build\Desktop_Qt_6_7_2_MinGW_64_bit-Debug/../../main.cpp:18: undefined reference to `__imp__ZN2mu10ParserBase7SetExprERKNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEE'
:-1: error: C:\Users\Aidan Beecher\Desktop\Qt Projects\TestMuParser\build\Desktop_Qt_6_7_2_MinGW_64_bit-Debug/../../main.cpp:20: undefined reference to `__imp__ZNK2mu10ParserBase4EvalEv'
C:\Users\Aidan Beecher\Desktop\Qt Projects\TestMuParser\libs\muparser\include\muParser.h:50: error: undefined reference to `__imp__ZTVN2mu6ParserE'
:-1: error: C:\Users\Aidan Beecher\Desktop\Qt Projects\TestMuParser\build\Desktop_Qt_6_7_2_MinGW_64_bit-Debug/../../libs/muparser/include/muParser.h:50: undefined reference to `__imp__ZN2mu10ParserBaseD2Ev'
:-1: error: [Makefile.Debug:72: debug/TestMuParser.exe] Error 1
Error while building\deploying project TestMuParser (kit:-1: Desktop Qt 6.7.2 MinGW 64-bit)

如前所述,无论出于何种原因,它似乎无法找到多个 MuParser 库符号,尽管我没有根据下载方式编辑任何头文件。这可能是 libmuparser.a 构建的问题吗?

编辑:建议删除先前的更新以及我的其他错误,并找到导致我的初始错误的链接命令。虽然我没有看到任何具有

/some/path/x86_64-w64-mingw32-g++ -o debug/TestMuParser.exe...
确切形式的命令,但我确实看到了一些类似的线条。这些是链接器命令吗?特别是,下面第四个框的第一行看起来好像它可能是链接器命令。

C:/Qt/Tools/mingw1120_64/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/Users/Aidan Beecher/Desktop/Qt 
Projects/TestMuParser/build/Desktop_Qt_6_7_2_MinGW_64_bit-Debug'
g++ -c -fno-keep-inline-dllexport -g -std=gnu++1z -Wall -Wextra -Wextra -fexceptions -mthreads -
DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DQT_QML_DEBUG -DQT_WIDGETS_LIB -
DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../../../TestMuParser -I. -
I../../libs/muparser/include -IC:/Qt/6.7.2/mingw_64/include -
IC:/Qt/6.7.2/mingw_64/include/QtWidgets -IC:/Qt/6.7.2/mingw_64/include/QtGui -
IC:/Qt/6.7.2/mingw_64/include/QtCore -Idebug -I. -IC:/VulkanSDK/1.3.290.0/include -
IC:/Qt/6.7.2/mingw_64/mkspecs/win32-g++  -o debug\main.o ..\..\main.cpp
g++ -Wl,-v -Wl,-subsystem,windows -mthreads -o debug\TestMuParser.exe debug/main.o 
debug/mainwindow.o debug/moc_mainwindow.o -L"C:\Users\Aidan Beecher\Desktop\Qt 
Projects\TestMuParser\libs\muparser\lib" -lmuparser C:\Qt\6.7.2\mingw_64\lib\libQt6Widgets.a 
C:\Qt\6.7.2\mingw_64\lib\libQt6Gui.a C:\Qt\6.7.2\mingw_64\lib\libQt6Core.a -lmingw32 
C:\Qt\6.7.2\mingw_64\lib\libQt6EntryPoint.a -lshell32  
c++ linker qt-creator static-libraries muparser
1个回答
0
投票

您仅将

muparser
构建为静态库:

cmake .. -DENABLE_SAMPLES=ON -DENABLE_OPENMP=ON \
    -DENABLE_WIDE_CHAR=OFF -DBUILD_SHARED_LIBS=OFF
                            ^^^^^^^^^^^^^^^^^^^^^^

为您提供复制到项目中的存档:

project/libs/muparser/lib/libmuparser.a

但是您已经使用(默认)建立了目标

debug\TestMuParser.exe
假设
muparser
是共享库/DLL。因此编译器 生成对符号的引用,例如:

undefined reference to `__imp__ZN2mu6ParserC1Ev'
undefined reference to `__imp__ZN2mu10ParserBase9DefineVarERKNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEPd'
undefined reference to `__imp__ZN2mu10ParserBase7SetExprERKNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEE'
undefined reference to `__imp__ZNK2mu10ParserBase4EvalEv'

其中

__imp_
( = import) 前缀表示引用的符号是动态符号 - 在预处理的源代码中以
__declspec(dllimport)
为前缀的符号 - 在
muparser
的导入库中定义DLL,您都没有构建过。

如果您在构建

-DBUILD_SHARED_LIBS=OFF
时没有指定
muparser
,则改为
libmuparser.a
你会建造:

libmuparser.dll     # the DLL
libmuparser.dll.a   # its import library.

如果您将这些复制到

project/libs/muparser/lib/libmuparser
,那么链接就会成功 - 尽管 为了让您的程序在运行时PATH中的某个位置
运行
,您需要确保
libmuparser.dll
动态链接器也可以根据 Windows 动态链接库搜索顺序找到。

由于您的所有 QT 库也是静态的,因此您似乎打算构建一个(很大程度上)静态的应用程序, 包括静态

libmuparser
。在这种情况下,您需要指示编译器not生成对
libmuparser
符号的动态引用,而只是静态链接的常规引用。

做到这一点的方法是指定预处理器标志:

-DMUPARSER_STATIC
当您编译源代码时,

g++
,这向编译器表明将链接静态
libmuparser
。这个事实是 文档中未提及 - :) - 在
muparser
网站
gitbug 存储库,但您可以在源代码中发现它。

您需要添加:

DEFINES += MUPARSER_STATIC

添加到您的 QT 项目文件中,将

-DMUPARSER_STATIC
添加到编译器命令行中。

© www.soinside.com 2019 - 2024. All rights reserved.