包和库管理和安装,以及与cmake的接口

问题描述 投票:1回答:1

我有一个特定的问题,作为一个更普遍的问题的背景。

有一个名为LAMMPS的科学包,它通常用作可执行文件。但是,它支持用作“库”。为了做正确的事情,我把它放在/ usr / local / lib / lammps中。它包含一个lammps / src /目录,它有大约40个源文件。使用提供的指令,我将lammps编译为lammps / src / liblammps_serial.so中的.so文件。

我在“〜/ code / ljtube /”中也有单独的代码。这使用cmake来尝试查找库。因此,我写了一个FindLAMMPS.txt,以便我可以使用

FIND_PACKAGE (lammps)

在我的CMakeLists中。我修改了libtool配置文件以在/ usr / local / success中搜索。我发现它在/ usr / local / lib /中搜索.so文件,在/ usr / local / include /中搜索.h文件。所以我在/ usr / local / lib /中创建了一个动态链接到.so文件,然后将.h文件从lammps / src /复制到/ usr / local / include /。

CMake现在可以找到这两个文件,但它无法链接到lammps / src /中的任何其他文件。似乎很荒谬的是需要为我想要包含的每个.h(group.h,fix.h,force.h,pair.h等)创建一个单独的FIND_PACKAGE。将整个.h文件包转储到/ usr / local / include /目录似乎也很荒谬。我将在本地和群集上使用此代码,并可能将其分发给其他组成员。

如何在没有硬编码的情况下让CMake找到我想要找到的内容/ usr / local / lib / lammps / src /?更一般地说,我应该如何管理像这样的大型软件包,以便在我编写的代码中轻松链接,即使最初的开发人员没有使用最好的约定?

(作为旁注,我正在使用共享库,因为它似乎是正确的选择,但我并没有特别嫁给它。我应该使用静态库吗?CMake是否有办法找到已编译的相对于当前源目录的库,可能是更好的实现方法吗?我知道我将在多个项目中使用LAMMPS,因此在表面上使用本地共享副本似乎最有意义。)

cmake installation package shared-libraries lammps
1个回答
1
投票

通常,find_package调用会生成一个变量,指定包的“includes”文件夹的路径。然后通过include_directories将其添加到调用者的CMakeLists.txt中。

例如,要使用find_package进行提升,您可以:

find_package(Boost)  # sets ${Boost_INCLUDE_DIRS} and ${Boost_LIBRARIES}
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
  add_executable(foo foo.cc)
  target_link_libraries(foo ${Boost_LIBRARIES})
endif()

关于您的附注,您可以使用find_library和/或find_path查找已知位置的库及其标题。

可以以避免在公共位置搜索的方式调用这两个命令,例如,通过将PATHS设置为已知位置并在find命令中使用NO_DEFAULT_PATH

另一个替代方案是让您的项目使用ExternalProject_Add函数,this article中有更详细的描述。从这篇文章:

ExternalProject_Add函数可以说“从互联网上下载这个项目,运行其配置步骤,构建并安装它”

这种方法的缺点是每个项目最终都会有自己的第三方源和lib副本。

© www.soinside.com 2019 - 2024. All rights reserved.