如何将非CMake库添加到CMake项目?

qhhrdooz  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(194)

我在我的项目中使用CMake,并且希望以不使用cmake的库的形式向其添加依赖项。我希望确保以后可以通过target_link_libraries命令使用该库。也就是说,为了让cmake知道要链接哪个文件,知道该库包含哪个目录。
例如,一些库使用autotools来构建和安装应用程序,构建过程涉及以下命令集,将库文件安装到$INSTALL目录中:

$ ./configure --prefix=$INSTALL
$ make -j
$ make install

之后,可以在$INSTALL目录中找到库文件:$INSTALL/include中的头(例如,$INSTALL/include/foobar.h)和$INSTALL/lib中的库(例如,$INSTALL/lib/foobar.a
问题是如何使用cmake来描述第三方库,以便将来可以在项目中轻松使用。
我尝试使用add_custom_target,但无法获得有效的构建(例如,target_include_directories无法与自定义目标一起工作)。

5uzkadbs

5uzkadbs1#

如果您希望使用CMake驱动非CMake项目的构建和安装,请使用ExternalProject模块。

ExternalProject_Add(foobar
  SOURCE_DIR # TODO
  INSTALL_DIR "${INSTALL}"
  CONFIGURE_COMMAND configure "--prefix=${INSTALL}"
  BUILD_COMMAND make -j
  INSTALL_COMMAND make install
)

至于使用非CMake构建系统构建的目标,你可以通过用add_library(<name> <type> IMPORTED [GLOBAL])定义IMPORTED库,然后调用适当的命令来告诉CMake生成的构建系统它们。

add_library(foobar STATIC IMPORTED GLOBAL)
set_properties(foobar PROPERTIES
  IMPORTED_LOCATION "${INSTALL}/lib/foobar${CMAKE_STATIC_LIBRARY_SUFFIX}"
)
target_include_directories(foobar INTERFACE "${INSTALL}/include")

然后只target_link_libraries到IMPORTED目标。
您也可以考虑使用非系统包管理器,例如Conan(CMake支持文档)或vcpkg(CMake support docs)。

相关问题