1

我使用 qt 编写了一个 Windows 应用程序,它具有许多 dll 依赖项。但是,当我将它移到另一台机器上时,我开始收到诸如“在 avformat55.dll 中找不到入口点@@somethingsomething”之类的错误。

关键是,这个消息是正确的。该函数根本不在那个dll中,它在完全不同的一个dll中,也位于可执行文件的文件夹中。

为什么会在错误的地方搜索功能?应该如何解决?

编辑:我已经将所有 ffmpeg dll 换成了为 x64 系统构建的;这会导致程序无法以 0xc000007b 异常启动;这可能与系统是 64 位有关。

编辑。我在其他几台机器上尝试过二进制文件,无论是 x64 还是 x86,都会发生同样的错误。但是调试构建工作正常,所以这是一个发布构建问题。

编辑:我的 .pro 文件

#-------------------------------------------------
#
# Project created by QtCreator 2013-05-17T10:55:01
#
#-------------------------------------------------


QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = LPR_Demo
TEMPLATE = app
# The application version
VERSION = 1.0

# Define the preprocessor macro to get the application version in our application.
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
SOURCES += main.cpp\
        mainwindow.cpp \
    imgProcessor.cpp \
    qpicturelabel.cpp \
    aboutdialog.cpp \
    state.cpp \
    qt_videoreader.cpp \
    roidialog.cpp \
    recognitionresult.cpp \
    ffmpeg_reader.cpp \
    label_videoplayer.cpp

HEADERS  += mainwindow.h \
    imgProcessor.h \
    qpicturelabel.h \
    aboutdialog.h \
    state.h \
    qt_videoreader.h \
    roidialog.h \
    recognitionresult.h \
    global.h \
    ffmpeg_reader.h \
    label_videoplayer.h

FORMS    += mainwindow.ui \
    aboutdialog.ui \
    roidialog.ui
LPRDIR = $$PWD/LPR
win32: LIBS += -L$$LPRDIR/bin/ -lliblpr
unix:LIBS += -L$$LPRDIR/bin -lLPR

INCLUDEPATH += $$LPRDIR/include

DEPENDPATH += $$LPRDIR/include

INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/

#OTHER_FILES += \
#    ffmpeg.pri
include(ffmpeg.pri)
#LIBS += -lavformat -lavcodec -lavutil -lswscale

RESOURCES += \
    lpr_Res.qrc

win32 {
dlls_to_move.path += $$OUT_PWD/bin

dlls_to_move.files += $$LPRDIR/bin/liblpr.dll

QTDIR=C:/Qt/4.8.4/

CONFIG (debug, debug|release) {

dlls_to_move.files += $$QTDIR/bin/QtCored4.dll \
    $$QTDIR/bin/QtGuid4.dll

}
CONFIG (release, debug|release) {

dlls_to_move.files += $$QTDIR/bin/QtCore4.dll \
    $$QTDIR/bin/QtGui4.dll
}
img_format.path += $$OUT_PWD/bin/imageformats
CONFIG (debug, debug|release) {

img_format.files += $$QTDIR/plugins/imageformats/qgifd4.dll \
    $$QTDIR/plugins/imageformats/qicod4.dll \
    $$QTDIR/plugins/imageformats/qjpegd4.dll \
    $$QTDIR/plugins/imageformats/qmngd4.dll \
    $$QTDIR/plugins/imageformats/qsvgd4.dll \
    $$QTDIR/plugins/imageformats/qtgad4.dll \
    $$QTDIR/plugins/imageformats/qtiffd4.dll

}
CONFIG (release, debug|release) {

img_format.files += $$QTDIR/plugins/imageformats/qgif4.dll \
    $$QTDIR/plugins/imageformats/qico4.dll \
    $$QTDIR/plugins/imageformats/qjpeg4.dll \
    $$QTDIR/plugins/imageformats/qmng4.dll \
    $$QTDIR/plugins/imageformats/qsvg4.dll \
    $$QTDIR/plugins/imageformats/qtga4.dll \
    $$QTDIR/plugins/imageformats/qtiff4.dll
}

ffmpeg_dll.path += $$OUT_PWD/bin

ffmpeg_dll.files += $$FFMPEG_LIBRARY_PATH/avutil-*.dll \
    $$FFMPEG_LIBRARY_PATH/avcodec-*.dll \
    $$FFMPEG_LIBRARY_PATH/avformat-*.dll \
    $$FFMPEG_LIBRARY_PATH/swscale-*.dll

main_exe.path += $$OUT_PWD/bin
CONFIG (debug, debug|release) {

main_exe.files += $$OUT_PWD/debug/LPR_Demo.exe

}
CONFIG (release, debug|release) {
main_exe.files += $$OUT_PWD/release/LPR_Demo.exe

}
INSTALLS += dlls_to_move img_format ffmpeg_dll main_exe
}

unix {
CONFIG (release, debug|release) {
    QMAKE_PRE_LINK += rm LPR_Demo_cmpr LPR_Demo$$escape_expand(\n\t)
    QMAKE_POST_LINK += upx -9 -oLPR_Demo_cmpr LPR_Demo$$escape_expand(\n\t)
    QMAKE_POST_LINK += cp -v -u LPR_Demo_cmpr $$OUT_PWD/../artifacts/examples/qt_demo/bin/unix
}

}

和 *.pri 文件

# Include the configuration file below in the QT .pro file, and modify the path accordingly.


# ##############################################################################
# ##############################################################################
# FFMPEG: START OF CONFIGURATION BELOW ->
# Copy these lines into your own project
# Make sure to set the path variables for:
# 1) ffmpeg_reader,
# 2) FFMPEG include path (i.e. where the directories libavcodec, libavutil, etc. lie),
# 3) the binary FFMPEG libraries (that must be compiled separately).
# Under Linux path 2 and 3 may not need to be set as these are usually in the standard include and lib path.
# Under Windows, path 2 and 3 must be set to the location where you placed the FFMPEG includes and compiled binaries
# Note that the FFMPEG dynamic librairies (i.e. the .dll files) must be in the PATH
# ##############################################################################
# ##############################################################################

# ##############################################################################
# Modify here: set FFMPEG_LIBRARY_PATH and FFMPEG_INCLUDE_PATH
# ##############################################################################

# Set FFMPEG_LIBRARY_PATH to point to the directory containing the FFmpeg import libraries (if needed - typically for Windows), i.e. the dll.a files
win32:FFMPEG_LIBRARY_PATH = $$PWD/ffmpeg/lib

unix: FFMPEG_LIBRARY_PATH = /usr/local/lib

# Set FFMPEG_INCLUDE_PATH to point to the directory containing the FFMPEG includes (if needed - typically for Windows)
win32:FFMPEG_INCLUDE_PATH = $$PWD/ffmpeg/include
unix:FFMPEG_INCLUDE_PATH = /usr/local/include
# ##############################################################################
# Do not modify: FFMPEG default settings
# ##############################################################################


# Set list of required FFmpeg libraries
#unix:LIBS += -L$$FFMPEG_LIBRARY_PATH
unix:LIBS += -lavformat -lavcodec -lavutil -lswscale
# Add the path
win32:LIBS += -L$$FFMPEG_LIBRARY_PATH
win32:LIBS += -lavformat -lavcodec -lavutil -lswscale
INCLUDEPATH += $$FFMPEG_INCLUDE_PATH

# Requied for some C99 defines
DEFINES += __STDC_CONSTANT_MACROS

# ##############################################################################
# FFMPEG: END OF CONFIGURATION
# ##############################################################################
4

0 回答 0