首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMake在指定文件夹中找到库,但是链接器没有

QMake在指定文件夹中找到库,但是链接器没有
EN

Stack Overflow用户
提问于 2016-07-15 11:26:48
回答 1查看 330关注 0票数 0

项目的状态

我正在尝试将QVTKWidget集成到qmake QT5.7项目中,从而为我的应用程序提供了一些对三维表面图图的良好支持( 2D图表功能目前由Qwt处理,但如果我发现它足够容易集成,可能会切换到VTK的2D图表模块)。

到目前为止已经做了什么

我已经成功地在调试和发布版本中构建了VTK工具包(分别可以在C:\VTKC:\VTKDebug\上获得)。此外,我还通过手动指定要包含哪个QWidget库的,成功地将一些VTK内容放置在中。

问题

在标题中提到的问题出现在我使用qmake的函数files()C:\VTK\binC:\VTKDebug\bin检索所有共享库时,这取决于项目的构建类型。原因是,根据我在应用程序中包含的内容,我可能需要手动指定3-4或20-30个VTK库。为了创建一个原型,这是非常手工的工作,我想跳过这个部分,在评估VTK是否适合我的需要之后再处理它。VTK中提供的cmake模块提供了此功能,因此如果您愿意,可以简单地链接到${VTK_LIBRARIES}。目前我不知道对qmake项目的开箱即用的支持。

这是我的pro文件:

代码语言:javascript
复制
QT       += core gui    
CONFIG   += c++11

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Demo
TEMPLATE = app

RESOURCES = resources.qrc

# Variables will store the path to the root directory of each library using the information provided by the respective system environment variables.
MHCP_API = ""
QWT_API = ""
VTK_API = ""

CONFIG(debug, debug|release) {
    message(Application will be built in DEBUG mode)
    MHCP_API = $$(MCHP_HMI_API_PATH) # TODO Compile the library for debug releases (requires Visual C++)
    QWT_API = $$(QWT_PATH) # QWT on my system is compiled in debug_and_release mode which means that both versios of the library are located at the same location (different names though!)
    VTK_API = $$(VTK_PATH_DEBUG)
    LIBS += -L$$QWT_API\\lib -lqwtd \
            -L$$MHCP_API\\lib -lmchp_hmid
}
else {
    message(Application will be built in RELEASE mode)
    MHCP_API = $$(MCHP_HMI_API_PATH)
    QWT_API = $$(QWT_PATH)
    VTK_API = $$(VTK_PATH)
    LIBS += -L$$QWT_API\\lib -lqwt \
            -L$$MHCP_API\\lib -lmchp_hmi
}

message(-----------------------------------------------------------------------------------------)

isEmpty(MHCP_API) { error(MHCP_API variable is empty. Please make sure that MCHP_HMI_API_PATH system variable is set and that you have both reading and writing access to it) }
else { message(MHCP_API root folder set to $$MHCP_API) }

isEmpty(QWT_API) { error(QWT_API variable is empty. Please make sure that QWT system variable is set and that you have reading access to it) }
else { message(QWT_API root folder set to $$QWT_API) }

isEmpty(VTK_API) { error(VTK_API variable is empty. Please make sure that VTK system variable is set and that you have reading access to it) }
else { message(VTK_API root folder set to $$VTK_API) }

message(-----------------------------------------------------------------------------------------)

DEFINES += "VTK_DEFINITIONS"

#LIBS     += -L$$VTK_API\\lib -lvtkRenderingCore-7.0 -lvtkRenderingOpenGL2-7.0 -lvtkCommonExecutionModel-7.0 -lvtkCommonCore-7.0 -lvtkViewsQt-7.0 -lvtkGUISupportQt-7.0 -lvtkRenderingQt-7.0 -lvtkChartsCore-7.0 -lvtkFiltersSources-7.0 #-lvtkRenderingOpenGL2-7.0 #FilterSources is required for the SphereSource example

LIBS    += -L$$VTK_API\\bin
VTK_API_SHARED_LIB_FILES = $$files($$VTK_API\\bin\\*.dll)
for(FILE, VTK_API_SHARED_LIB_FILES) {
    BASENAME = $$basename(FILE)
    NO_PREFIX_NAME = $$replace(BASENAME, lib,)
    VTK_LIB = $$replace(NO_PREFIX_NAME, .dll,)
    message(Found "$$VTK_LIB")
    LIBS += -l$$VTK_LIB
}

message(-----------------------------------------------------------------------------------------)
message(Appending $$LIBS)

INCLUDEPATH += $$MHCP_API\\include \
               $$QWT_API\\include \
               $$VTK_API\\include\\vtk-7.0


HEADERS  += device_api.h \
    device_api_dynamic.h \
    demo.h \
    device.h \
    misc.h \
    device_plot.h

SOURCES  += main.cpp\
    demo.cpp \
    device.cpp \
    device_plot.cpp

FORMS    += demo.ui

RESOURCES += \
    resources.qrc

当我执行qmake时,我在Qt中看到了以下消息(在64位Windows 10系统上使用QT5.7SDK和MinGW 5.3全部32位的):

代码语言:javascript
复制
Project MESSAGE: Application will be built in DEBUG mode
Project MESSAGE: -----------------------------------------------------------------------------------------
Project MESSAGE: MHCP_API root folder set to C:\Program Files (x86)\Device\api
Project MESSAGE: QWT_API root folder set to C:\Qwt-6.1.3
Project MESSAGE: VTK_API root folder set to C:\VTKDebug
Project MESSAGE: -----------------------------------------------------------------------------------------
Project MESSAGE: Found vtkalg-7.0
Project MESSAGE: Found vtkChartsCore-7.0
Project MESSAGE: Found vtkCommonColor-7.0
Project MESSAGE: Found vtkCommonComputationalGeometry-7.0
Project MESSAGE: Found vtkCommonCore-7.0
Project MESSAGE: Found vtkCommonDataModel-7.0
Project MESSAGE: Found vtkCommonExecutionModel-7.0
Project MESSAGE: Found vtkCommonMath-7.0
Project MESSAGE: Found vtkCommonMisc-7.0
Project MESSAGE: Found vtkCommonSystem-7.0
Project MESSAGE: Found vtkCommonTransforms-7.0
Project MESSAGE: Found vtkDICOMParser-7.0
Project MESSAGE: Found vtkDomainsChemistry-7.0
Project MESSAGE: Found vtkDomainsChemistryOpenGL2-7.0
Project MESSAGE: Found vtkexoIIc-7.0
Project MESSAGE: Found vtkexpat-7.0
Project MESSAGE: Found vtkFiltersAMR-7.0
Project MESSAGE: Found vtkFiltersCore-7.0
Project MESSAGE: Found vtkFiltersExtraction-7.0
Project MESSAGE: Found vtkFiltersFlowPaths-7.0
Project MESSAGE: Found vtkFiltersGeneral-7.0
Project MESSAGE: Found vtkFiltersGeneric-7.0
Project MESSAGE: Found vtkFiltersGeometry-7.0
Project MESSAGE: Found vtkFiltersHybrid-7.0
Project MESSAGE: Found vtkFiltersHyperTree-7.0
Project MESSAGE: Found vtkFiltersImaging-7.0
Project MESSAGE: Found vtkFiltersModeling-7.0
Project MESSAGE: Found vtkFiltersParallel-7.0
Project MESSAGE: Found vtkFiltersParallelImaging-7.0
Project MESSAGE: Found vtkFiltersProgrammable-7.0
Project MESSAGE: Found vtkFiltersSelection-7.0
Project MESSAGE: Found vtkFiltersSMP-7.0
Project MESSAGE: Found vtkFiltersSources-7.0
Project MESSAGE: Found vtkFiltersStatistics-7.0
Project MESSAGE: Found vtkFiltersTexture-7.0
Project MESSAGE: Found vtkFiltersVerdict-7.0
Project MESSAGE: Found vtkfreetype-7.0
Project MESSAGE: Found vtkGeovisCore-7.0
Project MESSAGE: Found vtkglew-7.0
Project MESSAGE: Found vtkGUISupportQt-7.0
Project MESSAGE: Found vtkGUISupportQtSQL-7.0
Project MESSAGE: Found vtkImagingColor-7.0
Project MESSAGE: Found vtkImagingCore-7.0
Project MESSAGE: Found vtkImagingFourier-7.0
Project MESSAGE: Found vtkImagingGeneral-7.0
Project MESSAGE: Found vtkImagingHybrid-7.0
Project MESSAGE: Found vtkImagingMath-7.0
Project MESSAGE: Found vtkImagingMorphological-7.0
Project MESSAGE: Found vtkImagingSources-7.0
Project MESSAGE: Found vtkImagingStatistics-7.0
Project MESSAGE: Found vtkImagingStencil-7.0
Project MESSAGE: Found vtkInfovisCore-7.0
Project MESSAGE: Found vtkInfovisLayout-7.0
Project MESSAGE: Found vtkInteractionImage-7.0
Project MESSAGE: Found vtkInteractionStyle-7.0
Project MESSAGE: Found vtkInteractionWidgets-7.0
Project MESSAGE: Found vtkIOAMR-7.0
Project MESSAGE: Found vtkIOCore-7.0
Project MESSAGE: Found vtkIOEnSight-7.0
Project MESSAGE: Found vtkIOExodus-7.0
Project MESSAGE: Found vtkIOExport-7.0
Project MESSAGE: Found vtkIOGeometry-7.0
Project MESSAGE: Found vtkIOImage-7.0
Project MESSAGE: Found vtkIOImport-7.0
Project MESSAGE: Found vtkIOInfovis-7.0
Project MESSAGE: Found vtkIOLegacy-7.0
Project MESSAGE: Found vtkIOLSDyna-7.0
Project MESSAGE: Found vtkIOMINC-7.0
Project MESSAGE: Found vtkIOMovie-7.0
Project MESSAGE: Found vtkIONetCDF-7.0
Project MESSAGE: Found vtkIOParallel-7.0
Project MESSAGE: Found vtkIOParallelXML-7.0
Project MESSAGE: Found vtkIOPLY-7.0
Project MESSAGE: Found vtkIOSQL-7.0
Project MESSAGE: Found vtkIOVideo-7.0
Project MESSAGE: Found vtkIOXML-7.0
Project MESSAGE: Found vtkIOXMLParser-7.0
Project MESSAGE: Found vtkjpeg-7.0
Project MESSAGE: Found vtkjsoncpp-7.0
Project MESSAGE: Found vtkxml2-7.0
Project MESSAGE: Found vtkmetaio-7.0
Project MESSAGE: Found vtkNetCDF-7.0
Project MESSAGE: Found vtkNetCDF_cxx-7.0
Project MESSAGE: Found vtkoggtheora-7.0
Project MESSAGE: Found vtkParallelCore-7.0
Project MESSAGE: Found vtkpng-7.0
Project MESSAGE: Found vtkproj4-7.0
Project MESSAGE: Found vtkRenderingAnnotation-7.0
Project MESSAGE: Found vtkRenderingContext2D-7.0
Project MESSAGE: Found vtkRenderingContextOpenGL2-7.0
Project MESSAGE: Found vtkRenderingCore-7.0
Project MESSAGE: Found vtkRenderingFreeType-7.0
Project MESSAGE: Found vtkRenderingImage-7.0
Project MESSAGE: Found vtkRenderingLabel-7.0
Project MESSAGE: Found vtkRenderingLOD-7.0
Project MESSAGE: Found vtkRenderingOpenGL2-7.0
Project MESSAGE: Found vtkRenderingQt-7.0
Project MESSAGE: Found vtkRenderingVolume-7.0
Project MESSAGE: Found vtkRenderingVolumeOpenGL2-7.0
Project MESSAGE: Found vtksys-7.0
Project MESSAGE: Found vtkTestingGenericBridge-7.0
Project MESSAGE: Found vtkTestingIOSQL-7.0
Project MESSAGE: Found vtkTestingRendering-7.0
Project MESSAGE: Found vtktiff-7.0
Project MESSAGE: Found vtkverdict-7.0
Project MESSAGE: Found vtkViewsContext2D-7.0
Project MESSAGE: Found vtkViewsCore-7.0
Project MESSAGE: Found vtkViewsInfovis-7.0
Project MESSAGE: Found vtkViewsQt-7.0
Project MESSAGE: Found vtkz-7.0
Project MESSAGE: Found vtkhdf5-7.0
Project MESSAGE: Found vtkhdf5_hl-7.0
Project MESSAGE: -----------------------------------------------------------------------------------------
Project MESSAGE: Appending -LC:\Qwt-6.1.3\lib -lqwtd -LC:\Program Files (x86)\Device\api\lib -ldevice_apid -LC:\VTKDebug\bin -lvtkalg-7.0 -lvtkChartsCore-7.0 -lvtkCommonColor-7.0 -lvtkCommonComputationalGeometry-7.0 -lvtkCommonCore-7.0 -lvtkCommonDataModel-7.0 -lvtkCommonExecutionModel-7.0 -lvtkCommonMath-7.0 -lvtkCommonMisc-7.0 -lvtkCommonSystem-7.0 -lvtkCommonTransforms-7.0 -lvtkDICOMParser-7.0 -lvtkDomainsChemistry-7.0 -lvtkDomainsChemistryOpenGL2-7.0 -lvtkexoIIc-7.0 -lvtkexpat-7.0 -lvtkFiltersAMR-7.0 -lvtkFiltersCore-7.0 -lvtkFiltersExtraction-7.0 -lvtkFiltersFlowPaths-7.0 -lvtkFiltersGeneral-7.0 -lvtkFiltersGeneric-7.0 -lvtkFiltersGeometry-7.0 -lvtkFiltersHybrid-7.0 -lvtkFiltersHyperTree-7.0 -lvtkFiltersImaging-7.0 -lvtkFiltersModeling-7.0 -lvtkFiltersParallel-7.0 -lvtkFiltersParallelImaging-7.0 -lvtkFiltersProgrammable-7.0 -lvtkFiltersSelection-7.0 -lvtkFiltersSMP-7.0 -lvtkFiltersSources-7.0 -lvtkFiltersStatistics-7.0 -lvtkFiltersTexture-7.0 -lvtkFiltersVerdict-7.0 -lvtkfreetype-7.0 -lvtkGeovisCore-7.0 -lvtkglew-7.0 -lvtkGUISupportQt-7.0 -lvtkGUISupportQtSQL-7.0 -lvtkImagingColor-7.0 -lvtkImagingCore-7.0 -lvtkImagingFourier-7.0 -lvtkImagingGeneral-7.0 -lvtkImagingHybrid-7.0 -lvtkImagingMath-7.0 -lvtkImagingMorphological-7.0 -lvtkImagingSources-7.0 -lvtkImagingStatistics-7.0 -lvtkImagingStencil-7.0 -lvtkInfovisCore-7.0 -lvtkInfovisLayout-7.0 -lvtkInteractionImage-7.0 -lvtkInteractionStyle-7.0 -lvtkInteractionWidgets-7.0 -lvtkIOAMR-7.0 -lvtkIOCore-7.0 -lvtkIOEnSight-7.0 -lvtkIOExodus-7.0 -lvtkIOExport-7.0 -lvtkIOGeometry-7.0 -lvtkIOImage-7.0 -lvtkIOImport-7.0 -lvtkIOInfovis-7.0 -lvtkIOLegacy-7.0 -lvtkIOLSDyna-7.0 -lvtkIOMINC-7.0 -lvtkIOMovie-7.0 -lvtkIONetCDF-7.0 -lvtkIOParallel-7.0 -lvtkIOParallelXML-7.0 -lvtkIOPLY-7.0 -lvtkIOSQL-7.0 -lvtkIOVideo-7.0 -lvtkIOXML-7.0 -lvtkIOXMLParser-7.0 -lvtkjpeg-7.0 -lvtkjsoncpp-7.0 -lvtkxml2-7.0 -lvtkmetaio-7.0 -lvtkNetCDF-7.0 -lvtkNetCDF_cxx-7.0 -lvtkoggtheora-7.0 -lvtkParallelCore-7.0 -lvtkpng-7.0 -lvtkproj4-7.0 -lvtkRenderingAnnotation-7.0 -lvtkRenderingContext2D-7.0 -lvtkRenderingContextOpenGL2-7.0 -lvtkRenderingCore-7.0 -lvtkRenderingFreeType-7.0 -lvtkRenderingImage-7.0 -lvtkRenderingLabel-7.0 -lvtkRenderingLOD-7.0 -lvtkRenderingOpenGL2-7.0 -lvtkRenderingQt-7.0 -lvtkRenderingVolume-7.0 -lvtkRenderingVolumeOpenGL2-7.0 -lvtksys-7.0 -lvtkTestingGenericBridge-7.0 -lvtkTestingIOSQL-7.0 -lvtkTestingRendering-7.0 -lvtktiff-7.0 -lvtkverdict-7.0 -lvtkViewsContext2D-7.0 -lvtkViewsCore-7.0 -lvtkViewsInfovis-7.0 -lvtkViewsQt-7.0 -lvtkz-7.0 -lvtkhdf5-7.0 -lvtkhdf5_hl-7.0

到现在为止还好。如前所述,在链接阶段发生故障,即我得到以下错误

代码语言:javascript
复制
cannot find -lvtkalg-7.0
cannot find -lvtkxml2-7.0
cannot find -lvtkz-7.0

尽管我可以在qmake的输出中清楚地看到它们

代码语言:javascript
复制
Project MESSAGE: Appending -LC:\Qwt-6.1.3\lib
-lqwtd -LC:\Program Files (x86)\Device\api\lib -ldevice_apid
-LC:\VTKDebug\bin -lvtkalg-7.0 ... -lvtkxml2-7.0 .. -lvtkz-7.0

我怀疑这实际上与VTK本身有关,而是与我的项目的结构有关。

编辑:,我已经找到了原因,但不知道如何修复它。基本上,上述文件都有命名召集人libvtkNAMElib-7.0。因此,当我完成$$replace(BASENAME, lib,),,,,子字符串,都会被删除,这就让我们使用不存在的vtkNAME-7.0。我在查看资源管理器中提到的DLL文件时发现了这个问题,并注意到了这一点。我现在正在寻找一种只替换的方法--第一次出现子字符串。

PS:我很不高兴VTK工具包是如何从文件结构的角度来管理的。对于开发人员来说,为库文件命名约定似乎没有多大关系(这个注释并没有冒犯的意思)。*-/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-15 14:31:40

好了问题解决了。正如我在问题末尾的编辑部分中提到的,问题在于VTK开发人员选择了奇怪的命名约定,而且这些库中的三个库(至少在我的构建中没有启用所有特性)与其他库不一致。

造成这一问题的图书馆是

代码语言:javascript
复制
libvtkalglib-7.0
libvtkxml2lib-7.0
libvtkzlib-7.0

而其余的则遵循命名模式

代码语言:javascript
复制
libvtkXXX-7.0

我的一位同事注意到,所有文件都以libvtk*开头,而不仅仅是lib。如果将replace()的regex模式编辑为

代码语言:javascript
复制
NO_PREFIX_NAME = $$replace(BASENAME, libvtk, vtk)

我得到了想要的结果,因为只有lib也涵盖了*lib*,而libvtk覆盖了*libvtk*,这意味着*lib-7.0没有进入比赛。

下面是为那些想要的人抓取DLL文件的最后一个循环:

代码语言:javascript
复制
LIBS    += -L$$VTK_API\\bin
VTK_API_SHARED_LIB_FILES = $$files($$VTK_API\\bin\\*.dll)
for(FILE, VTK_API_SHARED_LIB_FILES) {
    BASENAME = $$basename(FILE)
    NO_PREFIX_NAME = $$replace(BASENAME, libvtk, vtk) # 3 of the VTK libs have the naming convention libvtkXXXlib-7.0 instead of libvtkXXX-7.0
    VTK_LIB = $$replace(NO_PREFIX_NAME, .dll,)
    message(Found "$$VTK_LIB")
    LIBS += -l$$VTK_LIB
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38394981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档