1

我正在尝试将两个库包含到我的项目中以使用它们。我将 CMake 与 CLion 一起使用。

这两个库是:https ://github.com/herumi/bls和https://github.com/herumi/mcl

我得到了以下项目设置:

在此处输入图像描述

这是主要的 CMake 文件:

cmake_minimum_required(VERSION 3.17)
project(blsbenchmark)

set(CMAKE_CXX_STANDARD 14)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")

set(SOURCE_FILES src/main.cpp)
add_executable(blsbenchmark ${SOURCE_FILES})

include(FindPkgConfig)
find_package(bls REQUIRED)
include_directories(${BLS_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${BLS_LIBRARY})

find_package(mcl REQUIRED)
include_directories(${MCL_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${MCL_LIBRARY})

Findbls.cmake: _

set(FIND_BLS_PATHS
        /opt/bls)

find_path(BLS_INCLUDE_DIR bls.h
        PATH_SUFFIXES include
        PATHS ${FIND_BLS_PATHS})

find_library(BLS_LIBRARY
        NAMES bls384_256
        PATH_SUFFIXES lib
        PATHS ${FIND_BLS_PATHS})

Findmcl.cmake: _

set(FIND_MCL_PATHS
        /opt/mcl)

find_path(MCL_INCLUDE_DIR bn_c384_256.h, bn.h
        PATH_SUFFIXES include
        PATHS ${FIND_MCL_PATHS})

find_library(MCL_LIBRARY
        NAMES mclbn384_256
        PATH_SUFFIXES lib
        PATHS ${FIND_MCL_PATHS})

此设置允许我很好地将库的文件包含在我的项目中:

在此处输入图像描述

但是,问题出现了,因为如您所见,我可以直接在我的主文件(bn.h 和 bls.h)中链接库文件,而不需要它们的前缀(bls/bls.h 或 mcl/bn.h)。

因此,当尝试构建它时,我得到:

fatal error: mcl/bn.h: No such file or directory
   11 | #include <mcl/bn.h>
      |          ^~~~~~~~~~

因为库本身需要前缀“mcl/bn.h”路径。

在此处输入图像描述

因此,问题是我如何将这两个库(mcl 和 bls)包含在我的项目中,并在路径中添加前缀,这样这也与这两个库兼容。

4

1 回答 1

1

正如这里的问答中所讨论的,您必须为命令提供不同的路径include_directories()。在您的情况下,您可以将目录提供给在您的自定义查找模块中找到的目录。

例如,对于mcl存储库,标头位于此处mcl/include/mcl/bn.h。这就是您现在定义包含目录的方式:

mcl/include/mcl/      bn.h
^                     ^
include directory     #include header

为了实现你想要的,这就是你应该如何拆分它:

mcl/include/          mcl/bn.h
^                     ^
include directory     #include header

因此,使用目录到实际包含头文件的目录。

set(FIND_MCL_PATHS
        /opt/mcl)

# Find the path containing the header.
find_path(MCL_HEADER_DIR bn_c384_256.h, bn.h
        PATH_SUFFIXES include
        PATHS ${FIND_MCL_PATHS})

# If path with header file was found, set MCL_INCLUDE_DIR to the parent directory.
if(MCL_HEADER_DIR)
    # Grab the parent directory to MCL_HEADER_DIR.
    get_filename_component(PARENT_DIR ${MCL_HEADER_DIR} DIRECTORY)
    set(MCL_INCLUDE_DIR ${PARENT_DIR} CACHE PATH "MCL include directory" FORCE)
endif()

find_library(MCL_LIBRARY
        NAMES mclbn384_256
        PATH_SUFFIXES lib
        PATHS ${FIND_MCL_PATHS})

现在,您应该能够在代码中使用以下包含进行编译:

#include <mcl/bn.h>
于 2020-05-21T12:04:18.603 回答