2016-07-15 45 views
0

該項目的狀態QMAKE找到庫指定的文件夾中的鏈接但沒有

我想在QVTKWidgetqmake的Qt 5.7的項目整合,從而提供我的應用程序與3D一些不錯的支持曲面圖(2D圖表特徵目前由Qwt處理,但如果我覺得它足夠容易集成,我可能會切換到VTK的2D圖表模塊)。

什麼已經做了迄今爲止

我已經成功地構建了VTK工具包的調試和在C:\VTKC:\VTKDebug\發行版本(分別可用。此外,我也已經成功地設法將一些在我的QWidget VTK含量手動指定其中DLL庫是被包括在內。

問題

標題中提到的問題出現在我使用qmake的函數files()C:\VTK\binC:\VTKDebug\bin取回所有共享庫時,取決於項目的構建類型。原因在於,根據我在應用程序中包含的內容,我可能需要手動指定3-4個或20-30個VTK庫。爲了創建一個原型,這是相當的體力勞動,我想稍後跳過該部分,然後在評估VTK是否適合我的需求之後處理它。 VTK提供的cmake模塊提供此功能,所以如果您願意,您可以簡單地鏈接到${VTK_LIBRARIES}。目前我不知道qmake項目的開箱即用支持。

這裏是我的pro文件:

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 

當我在Qt Creator中(使用Qt 5.7的SDK使用MinGW 5.3在64位的Windows 10系統所有32位)執行qmake我看到下面的消息:

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 

到目前爲止,這麼好。如前所述事情不能在鏈接階段即出現以下錯誤

cannot find -lvtkalg-7.0 
cannot find -lvtkxml2-7.0 
cannot find -lvtkz-7.0 

即使我可以清楚地看到他們在輸出qmake

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,)lib子串被刪除,離開我vtkNAME-7.0這不存在。我在資源管理器中查看上述DLL文件時發現了這一點,並注意到這種麻煩。我現在正在尋找一種方法來替換子字符串的第一次出現。

PS:我很不高興VTK工具包是如何管理文件結構的。對於開發人員來說,庫文件的命名約定似乎並不重要(本評論沒有任何意圖)。 : -/

回答

0

好的,問題解決了。正如我在EDIT部分中提到的那樣,問題在於VTK開發人員選擇的奇怪命名約定,以及三個(至少在我的版本中未啓用所有功能的情況下)這些事實圖書館不符合其餘的。

造成該問題的庫

libvtkalglib-7.0 
libvtkxml2lib-7.0 
libvtkzlib-7.0 

,其餘遵循命名架構

libvtkXXX-7.0 

我的一位同事注意到,所有文件都以libvtk*並不僅僅是lib的圖案。如果編輯replace()我正則表達式模式

NO_PREFIX_NAME = $$replace(BASENAME, libvtk, vtk) 

我得到期望的結果,因爲只有lib還涵蓋*lib*libvtk涵蓋*libvtk*這意味着*lib-7.0不落入了比賽。

這是爲那些誰想要它最終的DLL文件抓住循環:

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 
} 
相關問題