Building SMTP client for Qt for Android target

2019-08-09 02:25发布

问题:

I am using the SMTP Client project to create a library file (.dll) on Windows. Everything works fine and e-mails are sent successfully.

I want to port my Qt project to Android and since Android is a different architecture I need to build the library using a Android armv7 toolkit.

I try this, but I get error:

Internal Error: Unknown Android deployment JSON file location. Error while building/deploying project SMTPEmail (kit: Android for armeabi-v7a (GCC 4.9, Qt 5.4.2)) When executing step "Build Android APK"

I suspect there is something I have to add/remove from the project file. I see there is a "win32:CONFIG += dll", but nothing similar for other platforms.

The .pro files looks like this:

#-------------------------------------------------
#
# Project created by QtCreator 2011-08-11T20:59:25
#
#-------------------------------------------------

QT       += core network

TARGET = SMTPEmail

# Build as an application
#TEMPLATE = app

# Build as a library
TEMPLATE = lib
DEFINES += SMTP_BUILD
win32:CONFIG += dll

QMAKE_CXXFLAGS += -fPIC

SOURCES += \
    src/emailaddress.cpp \
    src/mimeattachment.cpp \
    src/mimefile.cpp \
    src/mimehtml.cpp \
    src/mimeinlinefile.cpp \
    src/mimemessage.cpp \
    src/mimepart.cpp \
    src/mimetext.cpp \
    src/smtpclient.cpp \
    src/quotedprintable.cpp \
    src/mimemultipart.cpp \
    src/mimecontentformatter.cpp \

HEADERS  += \
    src/emailaddress.h \
    src/mimeattachment.h \
    src/mimefile.h \
    src/mimehtml.h \
    src/mimeinlinefile.h \
    src/mimemessage.h \
    src/mimepart.h \
    src/mimetext.h \
    src/smtpclient.h \
    src/SmtpMime \
    src/quotedprintable.h \
    src/mimemultipart.h \
    src/mimecontentformatter.h \
    src/smtpexports.h

OTHER_FILES += \
    LICENSE \
    README.md

FORMS +=

回答1:

As commented in the OP, I had the same problem and could fix it by simply adding an application to my project.

My original project was a simple .pro file targetting a library (tinyxml). With Qt 5.2.1 (Qt Creator 3.0.1), I was able to compile the library for Android (creating a .so file). With Qt 5.5.0 (Qt Creator 3.4.0), I had the same error message as reported in the OP.

Here is my solution:

I created another .pro file targetting a dummy program:

mockup_app.pro:

TARGET = mockup_app
SOURCES += main.cpp
TEMPLATE = app

main.cpp:

// actually never compiled
int main()
{
    return 0;
}

toplevel.pro:

TEMPLATE = subdirs
SUBDIRS += tinyxml.pro
SUBDIRS += mockup_app.pro

Then, open toplevel.pro. Go to "Projects" tab, select "Run" and then select "mockup_app" as "Run configuration".

Now, you can right-click the library project and select "Compile": .so file will be created.

Looks like the problem is that "Run configuration" (absent from earlier QtCreator versions) needs an app to be selected....and when there is none, a lib is selected and then compilation does not even start.

Edit 07-20-2015: It's a Qt bug, I filled a bug report: https://bugreports.qt.io/browse/QTCREATORBUG-14710 and it was fixed. Next release of QtCreator should be fine.



回答2:

If you just want to make a successful compilation of your shared library without considering subsequent steps, there is a workaround:

Go to Qt Creator's -> Project -> Build -> Build Steps. Disable "Make install" and "Build Android APK".

It appears that there is a regression in Qt Creator when building a shared library for Android: It used to work with Qt Creator 3.0 (based on Qt 5.2) or earlier releases, but stops working with Qt Creator 3.1 (based on Qt 5.3) or the newer Qt Creator 3.4 (based on Qt 5.5).

Hope this bug will be fixed in future releases of Qt Creator.



回答3:

I managed to solve it by removing corresponding records in projectname.pro.user file.

  • Quit QtCreator
  • remove the elements containing apk attribute and install attribute. Not the attributes, but the elements containing them
  • run QtCreator and make sure there are no build apk and install steps in the project's build configuration

I also made sure there are no extra projectname.pro.user.* files and removed them, but I don't know if that matters.

Thanks @jonathanzh for the hint in his answer