Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在CMake中使用通过brew安装的Qwt_Macos_Cmake_Homebrew_Qwt - Fatal编程技术网

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

Macos 在CMake中使用通过brew安装的Qwt,macos,cmake,homebrew,qwt,Macos,Cmake,Homebrew,Qwt,我尝试在MacOS虚拟机上使用Qwt和CMake构建一个应用程序 我使用brew安装了Qt5和Qwt: brew安装qt5 qwt 结果是Qwt框架安装 标题在那里: /usr/local/ceral/qwt/6.1.4/lib/qwt.framework/Versions/6/Headers/qwt.h 图书馆在这里 file/usr/local/ceral/qwt/6.1.4/lib/qwt.framework/qwt /usr/local/ceral/qwt/6.1.4/lib/qwt.f

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

我使用brew安装了Qt5和Qwt:

brew安装qt5 qwt

结果是Qwt框架安装

标题在那里:

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

图书馆在这里

file/usr/local/ceral/qwt/6.1.4/lib/qwt.framework/qwt
/usr/local/ceral/qwt/6.1.4/lib/qwt.framework/qwt:Mach-O 64位动态链接共享库x86_64

在使用qmake构建的过程中,很容易使用它

LIBS+=-F/usr/local/ceral/qwt/6.1.4/lib
LIBS+=-框架qwt

但是我一直坚持使用CMake。我没有找到同样的方法

我已经根据CMake文档中的find_库编写了自己的FindQwt模块。 它在Linux上运行得非常好,但如果没有以下的黑客攻击,我无法使它在MacOS上运行:

要创建的符号链接将在include目录中显示qwt标题,并作为libqwt.dyn_lib显示:

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

我还必须删除我的FindQwt Cmake模块在前两次黑客攻击后发现的/usr/local/lib/qwt.framework(在/usr/local/ceral/qwt/6.1.4/lib/qwt.framework
上的符号链接),但我找不到任何原因,导致链接问题(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 "")
如果你有一些想法,一些想法,以避免上述黑客和hanle它在一个更优雅的方式与CMake模块,他们将受到欢迎

解决方案在没有先前描述的黑客攻击的情况下工作

  • 请参阅独立于qwt版本的usr/local/opt/qwt/lib
  • 由于Pedro的回答,使用下面修改过的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 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 "")

假设您已经熟悉,这是我的建议:

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变量影响find_*命令如何在macOS框架和unix风格的dylibs之间进行选择。您可能会发现,使用上述代码段输出执行cmake:

QWT found: /usr/local/Cellar/qwt/6.1.4/lib/qwt.framework
此代码段将qwt框架添加到CMakeLists.txt中定义的任何目标,但您可能更愿意将链接部分仅应用于一个目标,如下所示:

target_link_libraries(yourtarget ${QWT})

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

请提供您迄今为止编写的CMake代码。“如果您有一些想法,他们将受到欢迎”-我们不知道您的代码有什么问题,因为您没有显示它。对此表示抱歉,我只是提供了我的CMake模块代码以及我在VM中为使其处理brew Qwt安装所做的黑客操作。自制Qwt包不提供pkg配置定义,因此宏pkg_check_modules()将永远无法使用它。不幸的是,find_库失败,因为它正在搜索不存在的libqwt.dyn_库。lib是qwt(参见我的edts原始问题)。事实上,您的建议与我在模块中所做的非常相似。我编辑了答案,以展示您如何影响find_库,使其仅搜索macOS框架。这是一个小的,但我刚刚构建并运行,不需要破坏自制的符号链接。嗨,Pedro,感谢您的帮助。通过使用您的项目作为示例,我成功地调整了我的CMake模块,现在它在没有符号链接和删除黑客的情况下工作。您提供给我的路径/usr/local/opt/qwt/lib/非常有用,我以前没有注意到。关于CMAxyFiffyFrror,我没有改变任何东西,因为默认行为也考虑框架,因此它是足够的。