使用通过CMake中的brew安装的Qwt

我尝试在MacOS虚拟机上使用Qwt和CMake来构建应用程序。

我使用brew安装了Qt5和Qwt:

brew install qt5 qwt

结果是安装了Qwt框架。

标题在那里:

/usr/local/Cellar/qwt/6.1.4/lib/qwt.framework/Versions/6/Headers/qwt.h

图书馆在这里

file /usr/local/Cellar/qwt/6.1.4/lib/qwt.framework/qwt /usr/local/Cellar/qwt/6.1.4/lib/qwt.framework/qwt: Mach-O 64-bit dynamically linked shared library x86_64

在使用qmake进行buid期间很容易使用它

LIBS+= -F/usr/local/Cellar/qwt/6.1.4/lib LIBS += -framework qwt

但是我仍然坚持使用 CMake 。我没有成功找到方法。

我已经基于CMake文档中指示的find_library编写了自己的 FindQwt 模块。 它在Linux上可以很好地运行,但是如果没有以下技巧,我无法成功使其在MacOS上运行:

符号链接使qwt标头出现在包含目录中,而 qwt 作为 libqwt.dyn_lib

ln -sf /usr/local/Cellar/qwt/6.1.4/lib/qwt.framework/Versions/6/Headers /usr/local/Cellar/qwt/6.1.4/include ln -sf /usr/local/Cellar/qwt/6.1.4/lib/qwt.framework/qwt /usr/local/Cellar/qwt/6.1.4/libqwt.dylib

我还必须删除 /usr/local/lib/qwt.framework (/usr/local/Cellar/qwt/6.1.4/lib/qwt.framework上的符号链接 ),这是我在前2次黑客攻击后由FindQwt Cmake模块找到的,但我没有找到任何原因,并导致了链接问题(ld错误22)

这是我的Qwt cmake模块的代码

find_package(PkgConfig)
pkg_check_modules(PC_QWT QUIET libqwt)
if("${PC_QWT}" STREQUAL "")
    set(QWT_HINTS $ENV{QWT_INSTALL})

    set(QWT_PATHS
        /usr
        /usr/local/
        /usr/local/share/
        /usr/share/
       )
    if(NOT ${QWT_HINTS} STREQUAL "")
        set(QWT_PATHS ${QWT_HINTS})
    endif(NOT ${QWT_HINTS} STREQUAL "")

    find_path(Qwt_INCLUDE_DIR
              NAMES qwt.h
              PATHS ${QWT_PATHS}
              HINTS ${QWT_HINTS}
              PATH_SUFFIXES include qwt-qt4 qwt-qt5 qwt
              DOC "Variable storing the location of Qwt header"
             )

    set(ARCH_SUFFIX "lib")
    if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
      set(ARCH_SUFFIX "")
    endif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")

    find_library(Qwt_libraRY
                 NAMES qwt qwt-qt4 qwt-qt5
                 PATHS ${QWT_PATHS}
                 HINTS ${QWT_HINTS}
                 PATH_SUFFIXES ${ARCH_SUFFIX}
                 DOC "Variable storing the location of Qwt library"
                 NO_DEFAULT_PATH
                 NO_CMAKE_PATH
                )

    set(Qwt_VERSION ${Qwt_FIND_VERSION})
    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(Qwt
                                      FOUND_VAR Qwt_FOUND
                                      REQUIRED_VARS
                                      Qwt_libraRY
                                      Qwt_INCLUDE_DIR
                                      VERSION_VAR Qwt_VERSION
                                      )

    if(Qwt_FOUND)
        set(Qwt_libraRIES ${Qwt_libraRY})
        set(Qwt_INCLUDE_DIRS ${Qwt_INCLUDE_DIR})
        #set(Qwt_DEFINITIONS ${PC_Qwt_CflaGS_OTHER})
    endif()
    if(Qwt_FOUND AND NOT TARGET Qwt::Qwt)
        add_library(Qwt::Qwt UNKNOWN IMPORTED)
        set_target_properties(Qwt::Qwt PROPERTIES
        IMPORTED_LOCATION "${Qwt_libraRY}"
        INTERFACE_COMPILE_OPTIONS ""
        INTERFACE_INCLUDE_DIRECTORIES "${Qwt_INCLUDE_DIR}")
    endif()
endif("${PC_QWT}" STREQUAL "")

如果您有一些想法可以避免上述黑客攻击,并通过CMake模块以更优雅的方式处理它们,将受到欢迎

解决方案可以正常运行,而无需先前描述的黑客攻击

  • 请参阅与Qwt版本无关的 usr / local / opt / qwt / lib
  • 使用以下经过修改的CMake模块,这要归功于Pedro的回答(主要修改与结尾处的目标属性有关,而对标题搜索的影响很小)

这是代码

find_package(PkgConfig)
pkg_check_modules(PC_QWT QUIET libqwt)
if("${PC_QWT}" STREQUAL "")
    set(QWT_HINTS $ENV{QWT_INSTALL})

    set(QWT_PATHS
        /usr
        /usr/local/
        /usr/local/share/
        /usr/share/
       )
    if(NOT ${QWT_HINTS} STREQUAL "")
        set(QWT_PATHS ${QWT_HINTS})
    endif(NOT ${QWT_HINTS} STREQUAL "")

    find_path(Qwt_INCLUDE_DIR
              NAMES qwt.h
              PATHS ${QWT_PATHS}
              HINTS ${QWT_HINTS}
              PATH_SUFFIXES include qwt-qt4 qwt-qt5 qwt Headers
              DOC "Variable storing the location of Qwt header"
             )

    set(ARCH_SUFFIX "lib")
    if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
       set(ARCH_SUFFIX "")
    endif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")

    find_library(Qwt_libraRY
                 NAMES qwt qwt-qt4 qwt-qt5
                 PATHS ${QWT_PATHS}
                 HINTS ${QWT_HINTS}
                 PATH_SUFFIXES ${ARCH_SUFFIX}
                 DOC "Variable storing the location of Qwt library"
                )

    set(Qwt_VERSION ${Qwt_FIND_VERSION})
    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(Qwt
                                      FOUND_VAR Qwt_FOUND
                                      REQUIRED_VARS
                                      Qwt_libraRY
                                      Qwt_INCLUDE_DIR
                                      VERSION_VAR Qwt_VERSION
                                     )

    if(Qwt_FOUND)
        set(Qwt_libraRIES ${Qwt_libraRY})
        set(Qwt_INCLUDE_DIRS ${Qwt_INCLUDE_DIR})
    endif()
    if(Qwt_FOUND AND NOT TARGET Qwt::Qwt)
        if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
            get_filename_component(FRAMEWORK_LOC ${Qwt_libraRY} DIRECTORY)
            add_library(Qwt::Qwt INTERFACE IMPORTED)
            set_target_properties(Qwt::Qwt PROPERTIES
                                  INTERFACE_COMPILE_OPTIONS ""
                                  INTERFACE_INCLUDE_DIRECTORIES "${Qwt_INCLUDE_DIR}"
                                  )

            target_link_libraries(Qwt::Qwt INTERFACE "-F${FRAMEWORK_LOC} -framework qwt")
        else("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
            add_library(Qwt::Qwt UNKNOWN IMPORTED)
            set_target_properties(Qwt::Qwt PROPERTIES
                                  IMPORTED_LOCATION "${Qwt_libraRIES}"
                                  INTERFACE_COMPILE_OPTIONS ""
                                  INTERFACE_INCLUDE_DIRECTORIES "${Qwt_INCLUDE_DIR}"
                                  )
        endif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
    endif()
endif("${PC_QWT}" STREQUAL "")
zwx917 回答:使用通过CMake中的brew安装的Qwt

假设您已经熟悉cmake/qt basics,这是我的建议:

if(APPLE)
    set(CMAKE_FIND_FRAMEWORK ONLY)
    find_library(QWT
        NAMES qwt
        HINTS /usr/local/opt/qwt/lib/
        REQUIRED)
    if(QWT)
        include_directories(${QWT}/Headers)
        link_libraries(${QWT})
        message("QWT found: ${QWT}")
    endif()
endif()

CMake变量CMAKE_FIND_FRAMEWORK影响find_ *命令在macOS Framework和Unix风格的dylib之间进行选择的方式。您可能会注意到,使用上面的代码片段输出执行cmake:

QWT found: /usr/local/Cellar/qwt/6.1.4/lib/qwt.framework

此代码段将qwt框架添加到CMakeLists.txt中定义的任何目标,但是您可能希望将链接部分仅应用于一个目标,例如:

target_link_libraries(yourtarget ${QWT})

另一个警告:您应该将程序链接到由Qwt链接的相同Qt5框架,并由brew安装:QTDIR = / usr / local / opt / qt5

本文链接:https://www.f2er.com/3107168.html

大家都在问