架构 x86_64 的未定义符号:“hex(QTextStream&)”,引用自:(在 Mac 上安装 PyQwt-5.2.0)

Posted

技术标签:

【中文标题】架构 x86_64 的未定义符号:“hex(QTextStream&)”,引用自:(在 Mac 上安装 PyQwt-5.2.0)【英文标题】:Undefined symbols for architecture x86_64: "hex(QTextStream&)", referenced from: (Installing PyQwt-5.2.0 on Mac) 【发布时间】:2019-12-20 12:27:34 【问题描述】:

我正在尝试安装用于 LC/MS 分析的 emzed python 包。这个包依赖于 PyQt4 和 PyQWT。我已经安装了所有东西,但无法构建 PyQWT。我已经跳过了这么多错误,并且在这个链接错误上停留了一段时间。

我尝试修改 makefile (Qwt_version_info.mak) 以传递包含目录。我不知道如何指定适当的链接库来让他也编译(QTextStream等)

$  make -f qwt_version_info.mak 
Are we linking yet?1
Are we linking yet?2
Are we linking yet?3
Are we linking yet?4
Are we linking yet?5
g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o      
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
 "/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -dynamic -arch x86_64 -headerpad_max_install_names -macosx_version_min 10.9.0 -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o -lc++ -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "hex(QTextStream&)", referenced from:
      _main in qwt_version_info.o
  "QArrayData::deallocate(QArrayData*, unsigned long, unsigned long)", referenced from:
      QTypedArrayData<unsigned short>::deallocate(QArrayData*) in qwt_version_info.o
  "QTextStream::QTextStream(QIODevice*)", referenced from:
      _main in qwt_version_info.o
  "QTextStream::~QTextStream()", referenced from:
      _main in qwt_version_info.o
  "QTextStream::operator<<(char const*)", referenced from:
      _main in qwt_version_info.o
  "QTextStream::operator<<(int)", referenced from:
      _main in qwt_version_info.o
  "QFile::open(QFlags<QIODevice::OpenModeFlag>)", referenced from:
      _main in qwt_version_info.o
  "QFile::QFile(QString const&)", referenced from:
      _main in qwt_version_info.o
  "QFile::~QFile()", referenced from:
      _main in qwt_version_info.o
  "QString::fromAscii_helper(char const*, int)", referenced from:
      QString::QString(char const*) in qwt_version_info.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [qwt_version_info.app/Contents/MacOS/qwt_version_info] Error 1

这是生成文件。

1591 $  cat qwt_version_info.mak 
#############################################################################
# Makefile for building: qwt_version_info.app/Contents/MacOS/qwt_version_info
# Generated by qmake (2.01a) (Qt 4.8.7) on: Tue Aug 13 11:31:21 2019
# Project:  qwt_version_info.pro
# Template: app
# Command: /usr/local/opt/qt@4/bin/qmake -spec /usr/local/etc/qt4/mkspecs/macx-g++ -o qwt_version_info.mak qwt_version_info.pro
#############################################################################

####### Compiler, tools and options

CC            = gcc
CXX           = g++
DEFINES       = 
CFLAGS        = -pipe $(DEFINES)
CXXFLAGS      = -pipe -std=c++11 $(DEFINES)
INCPATH       = -I/usr/local/etc/qt4/mkspecs/macx-g++ -I. -I../qwt-5.2/src -I/usr/local/Cellar/qt@4/4.8.7_5/lib/QtCore.framework/Versions/4/Headers -I/usr/local/Cellar/sip/4.19.8_12/include -I/Users/Danny/.virtualenvs/emzed2.7/lib/python2.7/site-packages/numpy/core/include
LINK          = g++
LFLAGS        = -headerpad_max_install_names
LIBS          = $(SUBLIBS)    
AR            = ar cq
RANLIB        = ranlib -s
QMAKE         = /usr/local/opt/qt@4/bin/qmake
TAR           = tar -cf
COMPRESS      = gzip -9f
COPY          = cp -f
SED           = sed
COPY_FILE     = cp -f
COPY_DIR      = cp -f -R
STRIP         = 
INSTALL_FILE  = $(COPY_FILE)
INSTALL_DIR   = $(COPY_DIR)
INSTALL_PROGRAM = $(COPY_FILE)
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
export MACOSX_DEPLOYMENT_TARGET = 10.9

####### Output directory

OBJECTS_DIR   = ./

####### Files

SOURCES       = qwt_version_info.cpp 
OBJECTS       = qwt_version_info.o
DIST          = /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/unix.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/mac.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/gcc-base.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/gcc-base-macx.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/g++-base.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/g++-macx.conf \
        qwt_version_info.pro
QMAKE_TARGET  = qwt_version_info
DESTDIR       = 
TARGET        = qwt_version_info.app/Contents/MacOS/qwt_version_info

first: all
####### Implicit rules

.SUFFIXES: .o .c .cpp .cc .cxx .C

.cpp.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.cc.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.cxx.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.C.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.c.o:
    $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"

####### Build rules

all: qwt_version_info.mak qwt_version_info.app/Contents/PkgInfo qwt_version_info.app/Contents/Resources/empty.lproj $(TARGET)

$(TARGET):  $(OBJECTS)  
    @$(CHK_DIR_EXISTS) qwt_version_info.app/Contents/MacOS/ || $(MKDIR) qwt_version_info.app/Contents/MacOS/ 
    $(LINK) -v $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

$(info Are we linking yet?1)

qwt_version_info.mak: qwt_version_info.pro  /usr/local/etc/qt4/mkspecs/macx-g++/qmake.conf /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/unix.conf \
        /usr/local/etc/qt4/mkspecs/common/mac.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/gcc-base.conf \
        /usr/local/etc/qt4/mkspecs/common/gcc-base-macx.conf \
        /usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/g++-base.conf \
        /usr/local/etc/qt4/mkspecs/common/g++-macx.conf
    $(QMAKE) -spec /usr/local/etc/qt4/mkspecs/macx-g++ -o qwt_version_info.mak qwt_version_info.pro
/usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/unix.conf:
/usr/local/etc/qt4/mkspecs/common/mac.conf:
/usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/gcc-base.conf:
/usr/local/etc/qt4/mkspecs/common/gcc-base-macx.conf:
/usr/local/Cellar/qt@4/4.8.7_5/etc/qt4/mkspecs/common/g++-base.conf:
/usr/local/etc/qt4/mkspecs/common/g++-macx.conf:
qmake:  FORCE
    @$(QMAKE) -spec /usr/local/etc/qt4/mkspecs/macx-g++ -o qwt_version_info.mak qwt_version_info.pro


$(info Are we linking yet?2)

qwt_version_info.app/Contents/PkgInfo: 
    @$(CHK_DIR_EXISTS) qwt_version_info.app/Contents || $(MKDIR) qwt_version_info.app/Contents 
    @$(DEL_FILE) qwt_version_info.app/Contents/PkgInfo
    @echo "APPL????" >qwt_version_info.app/Contents/PkgInfo
qwt_version_info.app/Contents/Resources/empty.lproj: 
    @$(CHK_DIR_EXISTS) qwt_version_info.app/Contents/Resources || $(MKDIR) qwt_version_info.app/Contents/Resources 
    @touch qwt_version_info.app/Contents/Resources/empty.lproj

: 
    @$(DEL_FILE) 
    @sed -e "s,@SHORT_VERSION@,1.0,g" -e "s,@TYPEINFO@,????,g" -e "s,@ICON@,,g" -e "s,@EXECUTABLE@,qwt_version_info,g" -e "s,@TYPEINFO@,????,g"  >
dist: 
    @$(CHK_DIR_EXISTS) .tmp/qwt_version_info1.0.0 || $(MKDIR) .tmp/qwt_version_info1.0.0 
    $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/qwt_version_info1.0.0/ && (cd `dirname .tmp/qwt_version_info1.0.0` && $(TAR) qwt_version_info1.0.0.tar qwt_version_info1.0.0 && $(COMPRESS) qwt_version_info1.0.0.tar) && $(MOVE) `dirname .tmp/qwt_version_info1.0.0`/qwt_version_info1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/qwt_version_info1.0.0

$(info Are we linking yet?3)

clean:compiler_clean 
    -$(DEL_FILE) $(OBJECTS)
    -$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
    -$(DEL_FILE) -r qwt_version_info.app
    -$(DEL_FILE) qwt_version_info.mak


compiler_clean: 

####### Compile

$(info Are we linking yet?4)
qwt_version_info.o: qwt_version_info.cpp 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qwt_version_info.o qwt_version_info.cpp

$(info Are we linking yet?5)
####### Install

install:   FORCE

uninstall:   FORCE

FORCE:

非常感谢任何帮助。

更新: 在下面 /usr/local/Cellar/qt@4/4.8.7_5/lib/QtCore.framework 我找到了一个名为 QtCore 的二进制文件。我将它重命名为 libQtCore.so,当我将它与这个二进制文件链接时,这是我的新错误消息:

$ g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o  -L/usr/local/Cellar/qt@4/4.8.7_5/lib/QtCore.framework -lQtCore

 "/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -dynamic -arch x86_64 -headerpad_max_install_names -macosx_version_min 10.14.0 -o qwt_version_info.app/Contents/MacOS/qwt_version_info -L/usr/local/Cellar/qt@4/4.8.7_5/lib/QtCore.framework qwt_version_info.o -lQtCore -lc++ -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "QArrayData::deallocate(QArrayData*, unsigned long, unsigned long)", referenced from:
      QTypedArrayData<unsigned short>::deallocate(QArrayData*) in qwt_version_info.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

现在我只需要帮助找到 QArrayData 符号的库二进制文件的位置。我在谷歌上找不到任何有用的东西。

【问题讨论】:

这是全部输出吗? $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qwt_version_info.o qwt_version_info.cpp 看起来像扩展为:g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o 但查看 makefile 顶部设置的变量,我希望它会有所不同。此外,我没有看到 any 您的 are we linking yet info/debug 行 - 这些将在 makefile 被解析时打印(makefile 首先解析文件,打印任何信息行,然后运行规则)。你能提供更多关于这里发生的事情的信息吗? 我在运行 makefile 后将所有“我们正在链接”放入其中。它们都打印在输出的最顶部。我不知道 make 首先解析文件然后运行规则。现在,为什么它们都打印在输出的顶部就很有意义了。我已经编辑了这篇文章,以准确反映我在运行上面发布的 makefile 时得到的输出。 啊,我现在明白了。因此,我们在跟踪开始时看到的行就在 Are we linking yet... 之后是这一行:$(LINK) -v $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)。哪种暗示 $(OBJECTS) 为空或对象已经构建(文件qwt_version_info.o 已经存在)。接下来没有链接标志,设置我认为这是您要添加的内容?您需要链接到哪些库 - 因为我们可以将它们添加到 $(LINK)$(SUBLIBS) 用于组成 $(LINK) 我很确定缺少的是 Qt4 中的某个库我只是不知道如何找到正确的库或如何搜索缺少的符号。我仍在努力解决链接问题。 【参考方案1】:

这可能还不是完整的答案,但它太大了,无法发表评论。

所以让我们专注于这里的单行:

g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o      

现在你得到了一些未定义的引用,比如:QByteArray 和 QTextStream。这些都存在于库 (IIRC) qtxcore 或 qtxcored (debug) 中,其中 x 是 qt 版本。所以我想你是libqt4core.solibqt4cored.so

所以我们需要两点信息,我们需要知道这是安装在哪里以及您拥有哪种类型(调试或发布)。

这些库通常位于 /usr/lib/... 的某个位置,您会在其中的某个位置找到 libqt5core[d].so(IIRC /usr/lib/qt4/ - 但这是一个猜测)。

假设您有调试库 - 但很可能两者都在那里,然后我们可以将该库链接到您的链接器行:

注意:只需手动运行此行即可开始,然后我们会将其添加到您的 makefile 中。

g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o -L/usr/lib/qt4 -lqt4cored

在这里你可以看到我们已经添加了库所在的路径(-L...)和库本身(-l...)。

现在,这将使您的链接器能够找到 QByteArray 等...但是根据您使用的 Qt 位,您可能会缺少更多的东西。以下是您可能需要添加的其他可能库的列表:

libQt4Gui.so
libQt4Core.so
libQt4DBus.so
libQt4PrintSupport.so
libQt4Widgets.so
libQt4Network.so
libQt4XcbQpa.so
libQt4Svg.so
libicui18n.so
libicuuc.so
libicudata.so

注意:我从很久以前回答的另一个问题中得到了这个列表,所以它可能需要编辑,你可能想也可能不想使用调试版本(例如 libQt5Gui.so - > libQt5Guid.so)。该列表没有特定的顺序。

所以你最终会得到:

g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o -L/usr/lib/qt4 -lqt4cored -licudata -licuuc ... etc...

让这条线工作,然后我们可以看到如何将它添加到您的 makefile - 添加库/路径是微不足道的。

【讨论】:

所以我似乎无法在我的计算机上找到 libQt4Core.so。我跑了find /usr/ -name "libQt4Core.so" -print,却一无所获。我能够在 /usr/local/Cellar/pyqt@4/4.12.1_1/lib/python2.7/site-packages/PyQt4 下找到 QtCore.so 文件。当我使用 -L 标志和 -lQtCore 传递此目录时,出现链接错误。 ld: library not found for -lQtCore这是我运行的命令:g++ -v -headerpad_max_install_names -o qwt_version_info.app/Contents/MacOS/qwt_version_info qwt_version_info.o -L/usr/local/Cellar/pyqt@4/4.12.1_1/lib/python2.7/site-packages/PyQt4 -lQtCore 我复制了一份 QtCore.so 并将其命名为 libQtCore.so,这只是返回了与我最初发布问题时相同的错误消息。 这里是site-packages/PyQt4目录下的所有库uic __init__.py Qt.so QtCore.so QtDeclarative.so QtDesigner.so QtGui.so QtHelp.so QtMultimedia.so QtNetwork.so QtOpenGL.so QtScript.so QtScriptTools.so QtSql.so QtSvg.so QtTest.so QtWebKit.so QtXml.so QtXmlPatterns.so pyqtconfig.py 我用我已经取得的进展更新了最初的帖子。 好吧,等一下——我觉得你有点乱,看起来你正在混合静态和共享对象——你可以这样做,但你必须小心。我也不知道那个文件到底是什么——如果它不是以 lib 开头的,我会非常怀疑它。您似乎更有可能没有正确安装 qt 或 pyqt?! - 它可能在/opt 之下。您可以使用-l:QtCore.so 指定非标准库名称。另外,要混合使用静态库和共享库,您需要使用 -static 和 -shared ,请参见此处的示例:...

以上是关于架构 x86_64 的未定义符号:“hex(QTextStream&)”,引用自:(在 Mac 上安装 PyQwt-5.2.0)的主要内容,如果未能解决你的问题,请参考以下文章

GoogleMapsSDK:架构 x86_64 的未定义符号

Cordova - 架构 x86_64 的未定义符号

架构 x86_64 的未定义符号:MqtUtil

切换到调试时架构 x86_64 的未定义符号

Xcode 错误 - 架构 x86_64 的未定义符号?

GraphicsMagick,架构 x86_64 的未定义符号