包和库管理和安装,以及与cmake的接口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包和库管理和安装,以及与cmake的接口相关的知识,希望对你有一定的参考价值。
我有一个特定的问题,作为一个更普遍的问题的背景。
有一个名为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,因此在表面上使用本地共享副本似乎最有意义。)
通常,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副本。
以上是关于包和库管理和安装,以及与cmake的接口的主要内容,如果未能解决你的问题,请参考以下文章
MySQL安装与配置(5.6.12,参考乐沙弥博客,未完成)