我正在尝试将 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
您仅将
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
添加到编译器命令行中。