我尝试在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 "")