【发布时间】: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_Addusable 和find_package。换句话说,这两个命令不以直接方式合作是对的。但是有办法让他们合作。正是在引用的问题中提出的。 (而且答案实际上提供了这样的方式)。 -
其实,
find_package是填充ITK_LIBRARIES变量的最简单方法,如果您使用ExternalProject方式构建ITK(而不是add_subdirectory)。在这种情况下,没有特定的静态库:如果 ITK 构建静态库,那么find_package()应该会找到它们。其他“自动”方式是......只是重新发明轮子(实现ITKConfig.cmake脚本的逻辑,由find_package使用)。 -
静态库的排序是一场噩梦。所以你是对的,我需要不惜一切代价使用
find_package。
标签: cmake static-linking itk