将Pistache包含到C++项目中

10

很抱歉这是一个非常入门级的问题,但我对C++还比较陌生。

我正在使用 pistache 构建一个RESTful服务。我已经检查过并在项目本身中运行了示例,但现在正在尝试导入/包含该框架以在自己的项目中使用。

我的文件夹结构如下:

rest_api
   |
   +--- build
   +--- include
          |
          +--- pistache
   +--- src
          |
          +--- main.cpp
   +--- tests

pistache目录包含了pistache源代码的所有编译内容。 (我不确定这里是否需要整个项目或只是头文件)

我已经尝试按照示例快速入门指南进行操作,但没有成功。

我的CMakeLists.txt目前非常简单,如下所示:

cmake_minimum_required(VERSION 3.5.1)
project(rest_api)

set(CMAKE_CXX_STANDARD 14)
set(PISTACHE_DIR "./include/pistache")

include_directories (${PISTACHE_DIR}/include)

add_executable(${PROJECT_NAME} src/main.cpp)

我的main.cpp是直接从他们的示例hello_server.cc复制过来的。

当我尝试make我的项目时,会出现如下异常(的快照):

main.cpp:(.text+0x143): undefined reference to `Pistache::Port::Port(unsigned short)'
main.cpp:(.text+0x148): undefined reference to `Pistache::Ipv4::any()'
main.cpp:(.text+0x162): undefined reference to `Pistache::Address::Address(Pistache::Ipv4, Pistache::Port)'
main.cpp:(.text+0x171): undefined reference to `Pistache::Http::Endpoint::options()'
main.cpp:(.text+0x185): undefined reference to `Pistache::Http::Endpoint::Options::threads(int)'
main.cpp:(.text+0x1c9): undefined reference to `Pistache::Http::Endpoint::Endpoint(Pistache::Address const&)'
main.cpp:(.text+0x1e2): undefined reference to `Pistache::Http::Endpoint::init(Pistache::Http::Endpoint::Options const&)'
main.cpp:(.text+0x223): undefined reference to `Pistache::Http::Endpoint::setHandler(std::shared_ptr<Pistache::Http::Handler> const&)'

我看过类似这个问题,但对我没有帮助。

我的问题是:

  1. 我需要整个Pistache源代码还是只需要头文件?
  2. 我的CMakeLists.txt文件有什么问题导致出现这些错误?

如果这被视为重复问题,请原谅,因为我一直没有找到我需要的正确答案。

谢谢!


1
你需要头文件和源代码或从源代码构建的库。由于我不熟悉pistache,所以不确定是哪一个,但通常在C++中,你需要头文件和库,并且需要将库添加到CMakeLists.txt文件中。 - john
1
通常情况下,使用时需要包含目录,其中包含库的头文件,并且需要与文件进行链接。您只完成了第一部分(包含目录),这就是为什么会出现“未定义引用”错误的原因。您可以查看文件examples/CMakeLists.txt,该文件构建示例:函数pistache_example针对每个示例调用并链接可执行文件。(请注意,此CMakeLists.txt不是独立的 - 它旨在从上层脚本中调用)。 - Tsyvarev
@Tsyvarev 谢谢您向我解释并提供示例链接。我只需要将 target_link_libraries 添加到我的 CMake 中,现在它可以工作了。如果您发布一个答案,我会接受的。 - wmash
我认为你缺少了 target_link_libraries。可能是重复的问题,参考 如何使用CMake正确链接库?如何使用CMake将静态库链接到可执行文件中 - jww
1个回答

5
这是我的 CMakeLists.txt 文件。正常工作 :D
cmake_minimum_required(VERSION 3.12)
project(PistacheExample)

set(CMAKE_CXX_STANDARD 11)

############################
##      SOURCE FILES      ##
############################
add_executable(${PROJECT_NAME} src/main.cpp)

#####################################
##      HEADERS SEARCH PATHS       ##
##################################### 
set(PROJECT_INCLUDE_DIR "src/include")
set(PISTACHE_INCLUDE_DIR "libs/pistache/include")

set(HEADER_SEARCH_PATHS ${PROJECT_INCLUDE_DIR} ${PISTACHE_INCLUDE_DIR})

#####################################
##      LIBRARY SEARCH PATHS       ##
#####################################
set(PISTACHE_LIBRARY "${PROJECT_SOURCE_DIR}/libs/pistache/lib/libpistache.a")
set(EXTRA_LIBRARY "-pthread -lssl")

set(LIBRARIES_SEARCH_PATHS ${PISTACHE_LIBRARY} ${EXTRA_LIBRARY})

#######################################
##      ADDING HEADERS LIBRARY       ##
#######################################
include_directories(${HEADER_SEARCH_PATHS})
target_link_libraries(${PROJECT_NAME} ${LIBRARIES_SEARCH_PATHS})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接