我对将外部库集成到我自己的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
我的目标:
到目前为止,我所做的是: -我在项目根目录为此外部库添加了一个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
的顺序的方法正确吗?
谢谢。
答案 0 :(得分:0)
最佳方法取决于bcrypt
CMake文件为您提供的内容,但这听起来像您想使用find_package
,而不是对路径进行硬编码。查看this的答案,但是find_package
有一些不同的配置:MODULE
和CONFIG
模式。
如果bcrypt
生成,并且为您创建了以下文件之一:
FindBcrypt.cmake
bcrypt-config.cmake
BcryptConfig.cmake
这可能会让您了解要使用哪种find_package
配置。建议您检查find_package
的{{3}},并仔细查看搜索程序的设置以确定CMake如何搜索bcrypt
。