1

我有一个使用一些 ffmpeg 功能的 qt 项目,我之前在 windows (x86) 和 ubuntu 上编译过。但是,它的 x86 二进制文件在 x64 Windows 机器上不能正常工作。我试过编译它,但遇到了一个奇怪的问题。

我使用的所有 ffmpeg 函数都列为未解析的外部函数;最特别的是,它们的名称都带有一个前导下划线(例如,avformat_close_input -> _avformat_close_input 等)。可以肯定的是,我已经为 x64 机器下载了最新的 ffmpeg 库,并通过依赖walker 运行它们——任何地方都没有前导下划线。

如何解决这个问题?

这是我的 .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
}
}

这是ffmpeg的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