C++ 如何使用MITK作为库

C++ 如何使用MITK作为库,c++,mitk,C++,Mitk,我知道这是一个老问题,但我试图搜索StackOverFlow,并没有找到任何适合我的好答案。所以我试着转载这个 我正在使用linux,并尝试使用CMake和Make命令构建代码 我试着把我自己的代码分开。我使用这个CMakeLists.txt cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project(MyProject) find_package(MITK 2018.04.02 REQUIRED) add_executable(MyA

我知道这是一个老问题,但我试图搜索StackOverFlow,并没有找到任何适合我的好答案。所以我试着转载这个

我正在使用linux,并尝试使用CMake和Make命令构建代码

我试着把我自己的代码分开。我使用这个CMakeLists.txt

cmake_minimum_required(VERSION 3.10 FATAL_ERROR) 
project(MyProject) 
find_package(MITK 2018.04.02 REQUIRED) 
add_executable(MyApp main.cpp) 
target_link_libraries(MyApp MitkCore)
但是find_包抛出错误:

Could not find a package configuration file provided by "MITK" with any of the following names:

MITKConfig.cmake
mitk-config.cmake
正如我从cmake教程中所读到的,它应该是一个包含“MITKConfig.cmake”文件的cmake文件夹,并且CMakeLists应该包含该文件夹。但我不知道该怎么做。有什么建议吗


p/S:使用引导库是在我们自己的项目中包含外部库的一个很好的例子。有人知道如何使用MITK Library吗?

我的节目只在Pop上的2018.04.99版上进行了测试_OS 18.04

Step3
示例可以使用以下
CMakeLists.txt
进行编译:

cmake_minimum_required(VERSION 3.17 FATAL_ERROR)

project(step3)

set(MITK_SUPERBUILD_DIR "/usr/mitk-build")
set(QT_DIR "/home/pop_os")

set(CMAKE_PREFIX_PATH
        "${MITK_SUPERBUILD_DIR}/MITK-build"
        "${MITK_SUPERBUILD_DIR}/ep/src/VTK/CMake/"
        "${QT_DIR}/Qt/5.12.8/gcc_64/lib/cmake/Qt5"
        )

find_package(MITK CONFIG REQUIRED)
find_package(OpenMP REQUIRED)

add_executable(${PROJECT_NAME} Step3.cpp)

target_link_libraries(${PROJECT_NAME} PUBLIC_HEADER
        MitkCore
        MitkQtWidgetsExt
        )
我正在开发一个更复杂的应用程序,该应用程序分为模块(静态库),我有一个顶级的
CMakeLists.txt
,它调用子项目:

cmake_minimum_required(VERSION 3.17 FATAL_ERROR)

project(covid-gui-desktop LANGUAGES CXX)
    
# Qt compilations system variables.
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set (CMAKE_AUTOMOC ON) # enables linker to qt moc headers
set (CMAKE_AUTOUIC ON) # enables linker to .ui files
set (CMAKE_AUTORCC ON) # enables linker to .qrc files

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_COLOR_MAKEFILE   ON)

set(MITK_SUPERBUILD_DIR "/usr/mitk-build")
set(QT_PATH "/home/pop_os")

set(CMAKE_PREFIX_PATH
        "${MITK_SUPERBUILD_DIR}/MITK-build/"
        "${MITK_SUPERBUILD_DIR}/ep/src/VTK/CMake/"
        "${QT_PATH}/Qt/5.12.8/gcc_64/lib/cmake/Qt5/"
        )

find_package(MITK CONFIG REQUIRED)
find_package(OpenMP REQUIRED)
find_package(Qt5 5.12 COMPONENTS Widgets Charts Svg REQUIRED)

### Static libraries
add_subdirectory(modules/AppDataManager)
add_subdirectory(modules/DarkStyle)
add_subdirectory(modules/VolumeVisualizationView)
add_subdirectory(modules/ThumbnailListView)
add_subdirectory(modules/DataManagerView)
###

set(cpp_files
        main.cpp
        MainWindow.cpp
        # Database / file managment
        Utils.cpp
        # Interface
        Concept1.cpp
        Concept2.cpp
        Concept3.cpp
        )

set(header_files
        MainWindow.h
        # Database / file managment
        Utils.h
        # Interface
        Concept1.h
        Concept2.h
        Concept3.h
        )

set(ui_files
        MainWindow.ui
        Concept1.ui
        Concept2.ui
        Concept3.ui
        )

set(qrc_files
        resource.qrc
        )

set(files ${cpp_files} ${header_files} ${ui_files} ${qrc_files})

add_executable(${PROJECT_NAME} ${files})

target_link_libraries(${PROJECT_NAME} PUBLIC
    MitkCore
    MitkQtWidgetsExt
    Qt5::Widgets
    Qt5::Charts
    Qt5::Svg
    AppDataManager
    DarkStyle
    VolumeVisualizationView
    DataManagerView
)

target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_14)

target_include_directories(${PROJECT_NAME} PUBLIC
        "${CMAKE_SOURCE_DIR}/modules/AppDataManager"
        "${CMAKE_SOURCE_DIR}/modules/DarkStyle"
        "${CMAKE_SOURCE_DIR}/modules/VolumeVisualizationView"
        "${CMAKE_SOURCE_DIR}/modules/DataManagerView"
        )
target\u include\u directories()
允许IDE查找静态库.h和.cpp文件。对于
MITK
这已经由
find_package()
完成

add_subdirectory()
调用静态库文件夹中的
CMakeLists.txt
。以下是用于
AppDataManager
的:

cmake_minimum_required(VERSION 3.17)

project(AppDataManager LANGUAGES CXX)

# Qt compilations system variables.
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set (CMAKE_AUTOMOC ON) # enable linker to qt headers
set (CMAKE_AUTOUIC ON) #
set (CMAKE_AUTORCC ON) # enable link to qrc

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_COLOR_MAKEFILE   ON)

set(MITK_SUPERBUILD_DIR "/usr/mitk-build")
set(QT_PATH "/home/pop_os")

set(CMAKE_PREFIX_PATH
        "${MITK_SUPERBUILD_DIR}/MITK-build/"
        "${MITK_SUPERBUILD_DIR}/ep/src/VTK/CMake/"
        "${QT_PATH}/Qt/5.12.8/gcc_64/lib/cmake/Qt5/"
        )

find_package(MITK CONFIG REQUIRED)
find_package(OpenMP REQUIRED)
find_package(Qt5 COMPONENTS Widgets REQUIRED)

set(cpp_files
        AppDataManager.cpp
        )

set(header_files
        AppDataManager.h
        )

add_library(${PROJECT_NAME} STATIC ${cpp_files} ${header_files})

target_compile_definitions(${PROJECT_NAME} PUBLIC cxx_std_14)

# Required on Unix OS family to be able to be linked into shared libraries.
set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)

target_link_libraries(${PROJECT_NAME} PUBLIC
        MitkCore
        MitkQtWidgetsExt
        Qt5::Widgets
        )
可能有一个模块(静态库)依赖于另一个模块
AppDataManager
由顶级应用程序和
DataManagerView
使用。如果我们使用与上一个类似的
CMakeLists.txt
,我们可以成功地将
DataManagerView
编译为一个独立的lib,但是顶层将失败,因为我们调用了
add_子目录(modules/AppDataManager)
两次,为了避免这种情况,我提出了这个CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)

project(DataManagerView LANGUAGES CXX)

# Qt compilations system variables.
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set (CMAKE_AUTOMOC ON) # enable linker to qt headers
set (CMAKE_AUTOUIC ON) #
set (CMAKE_AUTORCC ON) # enable link to qrc

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_COLOR_MAKEFILE   ON)

set(MITK_SUPERBUILD_DIR "/usr/mitk-build")
set(QT_PATH "/home/pop_os")

set(CMAKE_PREFIX_PATH
        "${MITK_SUPERBUILD_DIR}/MITK-build/"
        "${MITK_SUPERBUILD_DIR}/ep/src/VTK/CMake/"
        "${QT_PATH}/Qt/5.12.8/gcc_64/lib/cmake/Qt5/"
        )

find_package(MITK CONFIG REQUIRED)
find_package(OpenMP REQUIRED)
find_package(Qt5 COMPONENTS Widgets REQUIRED)


set(cpp_files
        DataManagerView.cpp
        QmitkDataManagerItemDelegate.cpp
        )

set(header_files
        DataManagerView.h
        QmitkDataManagerItemDelegate.h
        )

set(ui_files
        DataManagerView.ui
        )

add_library(${PROJECT_NAME} STATIC ${cpp_files} ${header_files} ${ui_files})

target_compile_definitions(${PROJECT_NAME} PUBLIC cxx_std_14)

set(AppDataManager_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../AppDataManager/")

###
# Checks whether this project is the main one or a subdirectory.
###
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
        # I am top-level project.
        add_subdirectory(${AppDataManager_PATH} build/)
else()
        # I am called from other project with add_subdirectory().

        # Required on Unix OS family to be able to be linked into shared libraries.
        set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()
###

target_link_libraries(${PROJECT_NAME} PUBLIC
        MitkCore
        MitkQtWidgetsExt
        Qt5::Widgets
        AppDataManager
        )

target_include_directories(${PROJECT_NAME} PUBLIC ${AppDataManager_PATH})
这些代码片段是我在写这个答案时正在开发的一个开源项目的一部分


链接:

如果没有安装在默认路径中,您需要告诉CMake在哪里可以找到您的库。看一个关于如何做的例子。这个问题确实在很多不同的图书馆被问过很多次,答案总是一样的。谢谢你的回答。是的,我已经告诉CMake通过添加find_包来查找库。但该库似乎没有公开*.cmake文件。这里我需要的是一个使用MITK库构建单独应用程序的示例。感谢所有已经这样做的人。您必须严格遵循有关如何基于Mitk创建应用程序的文档。AFAIK Mitk不作为库发布,而是使用超级构建系统。该系统至少将应用程序与所有Mitk构建树绑定在一起。您应该开始使用模板应用程序()谢谢@Arcadien,是的,我按照说明进行了操作,可以使用MITK模板编译我的应用程序。这是访问MITK Superbuild的唯一方法如果您打算从MITK编译并运行Step8示例,它将返回分段错误。它已于2020年6月19日修复,请参见。在我的答案中提供的链接中,示例文件夹中有固定版本。请注意,步骤8取决于步骤6和步骤7。