解决。当我将我的库添加为普通内部库时,一切都很好。我没有做的是在名称空间中定义的一些自由函数上使用MY_LIBRARY_EXPORT宏。不知何故,我以某种方式操纵了库导入以使这些功能正常工作,但它以其他方式破坏了这里所描述的。
我无法使用Qt Creator向导使用共享库。我尝试过动态链接,但都失败了,也不能用作静态库。在这两种情况下,我得到一个'未定义的引用` IMP _ *'错误。
这是我的专业档案。它们都在相同的SUB_DIR父项目中,并且路径正确。
库专业文件的相关部分:
TARGET = Prospec
TEMPLATE = lib
CONFIG += staticlib
QMAKE_CXXFLAGS += -std=c++11
DEFINES += PROSPEC_LIBRARY
整个用户.pro文件。 (ProspecTest是Prospec的单元测试项目)。
#-------------------------------------------------
#
# Project created by QtCreator 2013-12-12T15:04:30
#
#-------------------------------------------------
QT += testlib
QT -= gui
TARGET = prospectest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
QMAKE_CXXFLAGS += -std=c++11
SOURCES += prospectest.cpp \
mltest.cpp \
convertertest.cpp \
numericitemtest.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
HEADERS += \
utilities.h \
mltest.h \
convertertest.h \
numericitemtest.h
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../Prospec/release/ -lProspec
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../Prospec/debug/ -lProspec
INCLUDEPATH += $$PWD/../Prospec/debug
DEPENDPATH += $$PWD/../Prospec/debug
win32:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../Prospec/release/libProspec.a
else:win32:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../Prospec/debug/libProspec.a
# Boost
INCLUDEPATH += C:/boost/boost_1_55_0/
LIBS += "-LC:/boost/boost_1_55_0/stage/lib/"
编辑:未定义的引用错误仅在我调用源文件中的功能时发生。例如,如果我构造一个库对象,我得到错误,但如果我将该对象构造函数移动到头文件中,那么编译就可以了。现在我不确定问题是由Qt环境引起的,还是我不了解共享库。
答案 0 :(得分:2)
您描述的错误指向链接器错误。当未指定必需的对象/ lib文件时,会发生这种情况。最可能的情况是:您包含标头并使用该标头中的函数,但不指定在哪个库中定义该函数。
小例子:
//test.c
#include <winsock.h>
int main() { gethostbyname("localhost"); }
'undefined reference'链接器错误:
>gcc test.c
cczICEqq.o:test.c:(.text+0x1e): undefined refer ence to `gethostbyname@4'
collect2.exe: error: ld returned 1 exit status
在这种情况下,你必须像这样指定libwsock32.a:
gcc test.c -lwsock32
另请注意,libsomething.a不是唯一可以解析引用的地方。您可能错过了一个目标文件。
不幸的是,如果没有更多细节,我无法告诉你确切的问题。
答案 1 :(得分:1)
您可能忘记导出符号,如here on MSDN所述以及本网站上的各种问题。一般来说这是一种痛苦,有几种方法可以解决这个问题,没有比另一种更好的了。
这使得DLL和导入库实际上包含对您编译到其中的符号的引用。您可以将其部分地与GCC的符号可见性进行比较,尽管这仅适用于Linux,而GCC也支持MSDN for Windows中描述的内容。
答案 2 :(得分:0)
刚才有同样的问题。在macOS / OSX上构建正常,但在具有相同代码库的Windows上则无法正常运行。感谢rubenvb,他为我指出了正确的方向。这里是完整的解决方案,如何针对Qt做到这一点:
在构建库时在函数上使用AVCodecContext* codec = stream->codec
format->streams[i]->codec->codec-type == AVMEDIA_TYPE_AUDIO
avcodec_decode_audio4(codec,frame,&gotFrame,&packet)
。在使用库中的功能时,请使用Q_DECL_EXPORT
。
解决了我的问题,希望对您有所帮助!