【问题标题】:ld: symbol(s) not found for architecture x86_64 qtld:未找到架构 x86_64 qt 的符号
【发布时间】:2020-06-20 20:15:43
【问题描述】:

我正在尝试编译一个基本的 Qt 程序:

#include <iostream>
#include <QApplication>

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    std::cout << "test" << std::endl;
}

为了启动一个 Qt 项目,我做了以下操作:

  1. 制作 project.pro 文件:
TEMPLATE += app
QT += widgets gui
SOURCES += main.cpp
  1. 运行qmake 命令。
  2. 在生成的 Makefile 中编辑以下内容:
    • -mmacosx-version-min=10.15.3 在 CXXFLAGS
    • 从编译器中移除 -c 参数
  3. 比我运行make 并得到以下错误输出:
/Library/Developer/CommandLineTools/usr/bin/clang++ -pipe -stdlib=libc++ -O2 -std=gnu++11  -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mmacosx-version-min=10.15.3 -Wall -Wextra -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I/usr/local/Cellar/qt/5.14.1/lib/QtWidgets.framework/Headers -I/usr/local/Cellar/qt/5.14.1/lib/QtGui.framework/Headers -I/usr/local/Cellar/qt/5.14.1/lib/QtCore.framework/Headers -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AGL.framework/Headers -I/usr/local/Cellar/qt/5.14.1/mkspecs/macx-clang -F/usr/local/Cellar/qt/5.14.1/lib -o main.o main.cpp
Undefined symbols for architecture x86_64:
  "QApplication::QApplication(int&, char**, int)", referenced from:
      _main in main-96fd09.o
  "QApplication::~QApplication()", referenced from:
      _main in main-96fd09.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: *** [main.o] Error 1

我可能知道是什么原因造成的,在运行 make -v 时,我得到以下输出:

This program built for i386-apple-darwin11.3.0

clang++ --version 生成此输出:

Apple clang version 11.0.0 (clang-1100.0.33.16)
Target: x86_64-apple-darwin19.3.0
Thread model: posix

我认为 Makefile 正在尝试为旧架构编译我的代码,这会产生冲突,但我不确定。我的系统是运行 MacOS Catalina 10.15.3 的 Macbook Pro。 Qt 是 15.4.1 版。 Qmake 是 3.1 版。

完整的 Makefile:

#############################################################################
# Makefile for building: test.app/Contents/MacOS/test
# Generated by qmake (3.1) (Qt 5.14.1)
# Project:  test.pro
# Template: app
# Command: /usr/local/Cellar/qt/5.14.1/bin/qmake -o Makefile test.pro
#############################################################################

MAKEFILE      = Makefile

EQ            = =

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

CC            = /Library/Developer/CommandLineTools/usr/bin/clang
CXX           = /Library/Developer/CommandLineTools/usr/bin/clang++
DEFINES       = -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS        = -pipe -O2 $(EXPORT_ARCH_ARGS) -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mmacosx-version-min=10.13 -Wall -Wextra -fPIC $(DEFINES)
CXXFLAGS      = -pipe -stdlib=libc++ -O2 -std=gnu++11 $(EXPORT_ARCH_ARGS) -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mmacosx-version-min=10.15.3 -Wall -Wextra -fPIC $(DEFINES)
INCPATH       = -I. -I/usr/local/Cellar/qt/5.14.1/lib/QtWidgets.framework/Headers -I/usr/local/Cellar/qt/5.14.1/lib/QtGui.framework/Headers -I/usr/local/Cellar/qt/5.14.1/lib/QtCore.framework/Headers -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/AGL.framework/Headers -I/usr/local/Cellar/qt/5.14.1/mkspecs/macx-clang -F/usr/local/Cellar/qt/5.14.1/lib
QMAKE         = /usr/local/Cellar/qt/5.14.1/bin/qmake
DEL_FILE      = rm -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
COPY          = cp -f
COPY_FILE     = cp -f
COPY_DIR      = cp -f -R
INSTALL_FILE  = install -m 644 -p
INSTALL_PROGRAM = install -m 755 -p
INSTALL_DIR   = cp -f -R
QINSTALL      = /usr/local/Cellar/qt/5.14.1/bin/qmake -install qinstall
QINSTALL_PROGRAM = /usr/local/Cellar/qt/5.14.1/bin/qmake -install qinstall -exe
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
TAR           = tar -cf
COMPRESS      = gzip -9f
DISTNAME      = test1.0.0
DISTDIR = /Users/myName/School/C++/QtTest/.tmp/test1.0.0
LINK          = /Library/Developer/CommandLineTools/usr/bin/clang++
LFLAGS        = -stdlib=libc++ -headerpad_max_install_names $(EXPORT_ARCH_ARGS) -Wl,-syslibroot,/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mmacosx-version-min=10.13 -Wl,-rpath,@executable_path/../Frameworks
LIBS          = $(SUBLIBS) -F/usr/local/Cellar/qt/5.14.1/lib -framework QtWidgets -framework QtGui -framework AppKit -framework Metal -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL   
AR            = /Library/Developer/CommandLineTools/usr/bin/ar cq
RANLIB        = /Library/Developer/CommandLineTools/usr/bin/ranlib -s
SED           = sed
STRIP         = strip

####### Output directory

OBJECTS_DIR   = ./

####### Files

SOURCES       = main.cpp 
OBJECTS       = main.o
DIST          = /usr/local/Cellar/qt/5.14.1/mkspecs/features/spec_pre.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/qdevice.pri \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/device_config.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/common/unix.conf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/common/mac.conf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/mac/rez.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/mac/asset_catalogs.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/testcase_targets.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/exceptions.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/yacc.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/lex.prf \

        MORE FILES HERE

        test.pro  main.cpp
QMAKE_TARGET  = test
DESTDIR       = 
TARGET        = test.app/Contents/MacOS/test

####### Custom Variables
EXPORT_QMAKE_MAC_SDK = macosx
EXPORT_QMAKE_MAC_SDK_VERSION = 10.15.1
EXPORT_QMAKE_XCODE_DEVELOPER_PATH = /Library/Developer/CommandLineTools
EXPORT_VALID_ARCHS = x86_64
EXPORT_ACTIVE_ARCHS = $(filter $(EXPORT_VALID_ARCHS), $(ARCHS))
EXPORT_ARCH_ARGS = $(foreach arch, $(if $(EXPORT_ACTIVE_ARCHS), $(EXPORT_ACTIVE_ARCHS), $(EXPORT_VALID_ARCHS)), -arch $(arch))
EXPORT__PRO_FILE_ = /Users/myName/School/C++/QtTest/test.pro


include /usr/local/Cellar/qt/5.14.1/mkspecs/features/mac/sdk.mk
first: all
####### Build rules

test.app/Contents/MacOS/test:  $(OBJECTS)  
    @test -d test.app/Contents/MacOS/ || mkdir -p test.app/Contents/MacOS/
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

Makefile: test.pro /usr/local/Cellar/qt/5.14.1/mkspecs/macx-clang/qmake.conf /usr/local/Cellar/qt/5.14.1/mkspecs/features/spec_pre.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/qdevice.pri \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/device_config.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/common/unix.conf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/exceptions.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/yacc.prf \
        /usr/local/Cellar/qt/5.14.1/mkspecs/features/lex.prf \
        test.pro \
        /usr/local/Cellar/qt/5.14.1/lib/QtWidgets.framework/Resources/QtWidgets.prl \
        /usr/local/Cellar/qt/5.14.1/lib/QtGui.framework/Resources/QtGui.prl \
        /usr/local/Cellar/qt/5.14.1/lib/QtCore.framework/Resources/QtCore.prl

        MORE FILES HERE

    $(QMAKE) -o Makefile test.pro
/usr/local/Cellar/qt/5.14.1/mkspecs/features/spec_pre.prf:
/usr/local/Cellar/qt/5.14.1/mkspecs/qdevice.pri:
/usr/local/Cellar/qt/5.14.1/mkspecs/features/device_config.prf:
/usr/local/Cellar/qt/5.14.1/mkspecs/common/unix.conf:
/usr/local/Cellar/qt/5.14.1/mkspecs/common/mac.conf:
/usr/local/Cellar/qt/5.14.1/mkspecs/features/lex.prf:
test.pro:
/usr/local/Cellar/qt/5.14.1/lib/QtWidgets.framework/Resources/QtWidgets.prl:
/usr/local/Cellar/qt/5.14.1/lib/QtGui.framework/Resources/QtGui.prl:
/usr/local/Cellar/qt/5.14.1/lib/QtCore.framework/Resources/QtCore.prl:

MORE FILES HERE

qmake: FORCE
    @$(QMAKE) -o Makefile test.pro

qmake_all: FORCE

test.app/Contents/PkgInfo: 
    @test -d test.app/Contents || mkdir -p test.app/Contents
    @$(DEL_FILE) test.app/Contents/PkgInfo
    @echo "APPL????" > test.app/Contents/PkgInfo
test.app/Contents/Resources/empty.lproj: 
    @test -d test.app/Contents/Resources || mkdir -p test.app/Contents/Resources
    @touch test.app/Contents/Resources/empty.lproj

test.app/Contents/Info.plist: 
    @test -d test.app/Contents || mkdir -p test.app/Contents
    @$(DEL_FILE) test.app/Contents/Info.plist
    @sed -e "s,@SHORT_VERSION@,1.0,g" -e "s,\$${QMAKE_SHORT_VERSION},1.0,g" -e "s,@FULL_VERSION@,1.0.0,g" -e "s,\$${QMAKE_FULL_VERSION},1.0.0,g" -e "s,@TYPEINFO@,????,g" -e "s,\$${QMAKE_PKGINFO_TYPEINFO},????,g" -e "s,@BUNDLEIDENTIFIER@,com.yourcompany.test,g" -e "s,\$${PRODUCT_BUNDLE_IDENTIFIER},com.yourcompany.test,g" -e "s,\$${MACOSX_DEPLOYMENT_TARGET},10.13,g" -e "s,\$${IPHONEOS_DEPLOYMENT_TARGET},,g" -e "s,\$${TVOS_DEPLOYMENT_TARGET},,g" -e "s,\$${WATCHOS_DEPLOYMENT_TARGET},,g" -e "s,@ICON@,,g" -e "s,\$${ASSETCATALOG_COMPILER_APPICON_NAME},,g" -e "s,@EXECUTABLE@,test,g" -e "s,@LIBRARY@,test,g" -e "s,\$${EXECUTABLE_NAME},test,g" -e "s,@TYPEINFO@,????,g" -e "s,\$${QMAKE_PKGINFO_TYPEINFO},????,g" /usr/local/Cellar/qt/5.14.1/mkspecs/macx-clang/Info.plist.app >test.app/Contents/Info.plist

all: Makefile \
        test.app/Contents/PkgInfo \
        test.app/Contents/Resources/empty.lproj \
        test.app/Contents/Info.plist test.app/Contents/MacOS/test

dist: distdir FORCE
    (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR)

distdir: FORCE
    @test -d $(DISTDIR) || mkdir -p $(DISTDIR)
    $(COPY_FILE) --parents $(DIST) $(DISTDIR)/
    $(COPY_FILE) --parents /usr/local/Cellar/qt/5.14.1/mkspecs/features/data/dummy.cpp $(DISTDIR)/
    $(COPY_FILE) --parents main.cpp $(DISTDIR)/


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


distclean: clean 
    -$(DEL_FILE) -r test.app
    -$(DEL_FILE) .qmake.stash
    -$(DEL_FILE) Makefile


####### Sub-libraries

xcodeproj:
    @$(QMAKE) -spec macx-xcode "$(EXPORT__PRO_FILE_)"

mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all

check: first

benchmark: first

compiler_rcc_make_all:
compiler_rcc_clean:
compiler_moc_predefs_make_all: moc_predefs.h
compiler_moc_predefs_clean:
    -$(DEL_FILE) moc_predefs.h
moc_predefs.h: /usr/local/Cellar/qt/5.14.1/mkspecs/features/data/dummy.cpp
    /Library/Developer/CommandLineTools/usr/bin/clang++ -pipe -stdlib=libc++ -O2 -std=gnu++11 $(EXPORT_ARCH_ARGS) -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mmacosx-version-min=10.13 -Wall -Wextra -dM -E -o moc_predefs.h /usr/local/Cellar/qt/5.14.1/mkspecs/features/data/dummy.cpp

compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_moc_objc_header_make_all:
compiler_moc_objc_header_clean:
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_rez_source_make_all:
compiler_rez_source_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_moc_predefs_clean 

####### Compile

main.o: main.cpp /usr/local/Cellar/qt/5.14.1/lib/QtWidgets.framework/Headers/QApplication \
        /usr/local/Cellar/qt/5.14.1/lib/QtWidgets.framework/Headers/qapplication.h
    $(CXX) $(CXXFLAGS) $(INCPATH) -o main.o main.cpp

####### Install

install:  FORCE

uninstall:  FORCE

FORCE:


谢谢!

【问题讨论】:

  • 为什么要弄乱创建的 Makefile?如果不这样做会怎样?
  • @FrankOsterfeld 如果我不更改 Makefile,我的代码可以正常编译,但由于“执行格式错误”而无法运行:askubuntu.com/questions/696764/…。和stackoverflow.com/questions/42015121/…
  • 检查 cflags 和 cxxflags - 有不一致的地方。
  • @RichardBarber 你能详细说明一下吗?我究竟应该改变什么以使其保持一致?当我使用 C++(因此是 CXXFLAGs)进行编译时,CFLAGS 有多重要?
  • 对我有用,但我与您的设置有些不同:macOS 10.14.6;我正在使用完整的 Xcode 安装,而您似乎只安装了 CommandLineTools。另外,我使用的是官方 Qt 安装程序中的软件包,而不是自制软件。省略-c 似乎肯定是错误的(这是关于构建main.o,而不是链接二进制文件)。你什么时候收到exec format error?在open project.app,还是在project.app/Contents/MacOS/project

标签: c++ macos qt


【解决方案1】:

我犯了一个非常基本的错误。一切正常,但 Makefile 输出了一个 main.o 文件。我尝试使用./main.o 执行我的应用程序。这是不可能的。

执行 Qt 应用程序的正确方法是使用open main.app

无需修改makefile。

  1. 创建一个 myApp.pro 文件 示例:
TEMPLATE += app
QT += widgets gui
SOURCES += myApp.cpp
  1. 执行qmake
  2. 执行make
  3. 执行open myApp.app

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多