【问题标题】:Using ExternalProject_Add with ITK将 ExternalProject_Add 与 ITK 一起使用
【发布时间】:2017-10-02 15:38:38
【问题描述】:

我正在尝试对ITK 使用非常简单的ExternalProject。这将允许我的自动化 jenkins 从站直接检索ITK,而不是使用系统安装的库(因此我将其保留为使用ExternalProject 的选项)。

于是我写了如下一段代码:

set(ITK_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ITK")
set(ITK_INSTALL_PREFIX "${ITK_PREFIX}/install-$<CONFIG>")
ExternalProject_Add(ITK
URL http://sourceforge.net/projects/itk/files/itk/4.6/InsightToolkit-4.6.1.tar.xz
URL_MD5 d8dcab9193b55d4505afa94ab46de699
PREFIX ${ITK_PREFIX}
CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -DModule_ITKReview:BOOL=ON -DITK_USE_SYSTEM_GDCM:BOOL=ON -DCMAKE_INSTALL_PREFIX=${ITK_INSTALL_PREFIX} -DGDCM_DIR:PATH=${GDCM_INSTALL_PREFIX}
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target install --config $<CONFIG>
)
# include directory:
include_directories(${ITK_INSTALL_PREFIX}/include/ITK-4.6)
# link directory:
#link_directories(${ITK_INSTALL_PREFIX}/lib/) # $ sign is escaped
link_directories(${ITK_PREFIX}/install-/lib)

但后来我无法理解如何填充以下变量:ITK_LIBRARIES,我在整个代码库中一直在使用它。

我应该怎么写:

set(ITK_LIBRARIES
  itksys-4.6
  ITKCommon-4.6
  ITKIOImageBase-4.6
  ITKIOMeta-4.6
  ITKIOGDCM-4.6
  pthread
  ...? possibly others ? possibly different order ? ...
)

这感觉就像一个 hack,特别是很难维护。考虑到我需要链接到 static 库(对我的要求)。


显然,神奇的解决方案是让我运行find_package(ITK) 并完成。但是由于ExternalProject 是在构建时完成而不是在配置时完成的,所以我无法使用它(ref)。


因为人们觉得它是重复的,所以让我坚持:“是的,我明白我不能使用 find_package”。我的问题完全不同,而是关于静态链接的复杂情况。

【问题讨论】:

  • 澄清了为什么我的问题特别不同。想知道人们如何认为这是重复的,因为我什至解释并引用了它......
  • 参考问题解释了如何make ExternalProject_Add usablefind_package。换句话说,这两个命令不以直接方式合作是对的。但是有办法让他们合作。正是在引用的问题中提出的。 (而且答案实际上提供了这样的方式)。
  • 其实,find_package 是填充ITK_LIBRARIES 变量的最简单方法,如果您使用ExternalProject 方式构建ITK(而不是add_subdirectory)。在这种情况下,没有特定的静态库:如果 ITK 构建静态库,那么 find_package() 应该会找到它们。其他“自动”方式是......只是重新发明轮子(实现ITKConfig.cmake 脚本的逻辑,由find_package 使用)。
  • 静态库的排序是一场噩梦。所以你是对的,我需要不惜一切代价使用find_package

标签: cmake static-linking itk


【解决方案1】:

所以我不应该在ITK_LIBRARIES 中构建静态库的有序列表,这太复杂了。相反,我应该使用调用 find_package(ITK) 的逻辑。

我需要改变构建项目的方式并切换到 SuperBuild 类型的解决方案。

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 2019-02-14
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多