带有与项目一起构建的第三方库的CMake

时间:2019-04-30 23:21:52

标签: c++ cmake

我对将外部库集成到我自己的Cmake项目中的正确方法感到困惑(该外部项目需要与我的项目一起构建,它没有单独安装,因此我们不能使用find_library ,或者我认为)

假设我们具有这样的项目结构(本文简化):

my_proj/
--CMakeLists.txt
--src/
  +---CMakeLists.txt
  +---my_server.cpp

也就是说,我们有一个主CMakeLists.txt,它基本上位于根目录下,并为子目录调用CMakeLists。显然,在此示例中,由于简化了,所以我没有显示所有其他文件/目录。

我现在要在构建中包含另一个C ++ GitHub项目,恰好是此C ++ bycrypt实现:https://github.com/trusch/libbcrypt

我的目标:

  • 在通过其make流程构建my_server.cpp的同时,我希望包括bcrypt的头文件并与其库链接。

到目前为止,我所做的是: -我在项目根目录为此外部库添加了一个git模块:

[submodule "third_party/bcrypt"]
        path = third_party/bcrypt
        url = https://github.com/trusch/libbcrypt

现在,当我签出项目并进行子模块更新时,它会将bcrypt下拉至${PROJ_ROOT}/third_party

接下来,我将其添加到我的ROOT CMakeLists.txt

# Process subdirectories
add_subdirectory(third_party/bcrypt) 
add_subdirectory(src/)

太好了。我知道看到当我从根调用cmake时,它会在third_party内部构建bcrypt。然后建立我的src /目录。我这样做的原因是,我认为这是在构建src目录之前确保bcrypt库准备就绪的最佳方法。

问题:

a)现在如何正确将包含头文件的路径和此内置库的库位置放入src/内的CMakeLists.txt文件中?我应该将#include "../third_party/bcrypt/include/bcrypt/bcrypt.h"硬编码为my_server.cpp并将-L ../third_party/libcrypt.so硬编码为src/CMakeLists.txt还是有更好的方法?这是我今天完成的工作,但是很奇怪

我在src/CMakeLists.txt

set(BCRYPT_LIB,"../third_party/bcrypt/libbcrypt.so")
target_link_libraries(my app ${MY_OTHERLIBS} ${BCRYPT_LIB})

b)我依靠add_directory的顺序的方法正确吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

最佳方法取决于bcrypt CMake文件为您提供的内容,但这听起来像您想使用find_package,而不是对路径进行硬编码。查看this的答案,但是find_package有一些不同的配置:MODULECONFIG模式。

如果bcrypt生成,并且为您创建了以下文件之一:

FindBcrypt.cmake
bcrypt-config.cmake
BcryptConfig.cmake

这可能会让您了解要使用哪种find_package配置。建议您检查find_package的{​​{3}},并仔细查看搜索程序的设置以确定CMake如何搜索bcrypt