使用 CMake 包含库时路径不匹配
Path mismatch when including libraries with CMake
我正在尝试将两个库包含到我的项目中以使用它们。
我在 CLion 中使用 CMake。
两个库是:https://github.com/herumi/bls and 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})
这个设置允许我在我的项目中很好地包含库的文件:
但是,问题出现了,因为如您所见,我可以 link 库文件直接在我的主文件(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)包含到我的项目中,并在路径中添加前缀,以便它也与这两个库兼容。
如问答 here 中所述,您必须为 include_directories()
命令提供 不同的 路径。在您的情况下,您可以将 parent 目录提供给在自定义查找模块中找到的目录。
例如,对于 mcl
存储库,header 位于此处 mcl/include/mcl/bn.h
。这就是您现在定义包含目录的方式:
mcl/include/mcl/ bn.h
^ ^
include directory #include header
为了实现你想要的,这就是你应该将其拆分的方式:
mcl/include/ mcl/bn.h
^ ^
include directory #include header
因此,使用 parent 目录到实际包含 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>
我正在尝试将两个库包含到我的项目中以使用它们。 我在 CLion 中使用 CMake。
两个库是:https://github.com/herumi/bls and 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})
这个设置允许我在我的项目中很好地包含库的文件:
但是,问题出现了,因为如您所见,我可以 link 库文件直接在我的主文件(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)包含到我的项目中,并在路径中添加前缀,以便它也与这两个库兼容。
如问答 here 中所述,您必须为 include_directories()
命令提供 不同的 路径。在您的情况下,您可以将 parent 目录提供给在自定义查找模块中找到的目录。
例如,对于 mcl
存储库,header 位于此处 mcl/include/mcl/bn.h
。这就是您现在定义包含目录的方式:
mcl/include/mcl/ bn.h
^ ^
include directory #include header
为了实现你想要的,这就是你应该将其拆分的方式:
mcl/include/ mcl/bn.h
^ ^
include directory #include header
因此,使用 parent 目录到实际包含 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>