如何 link 使用 CMake 项目的外部库

How to link an external library with CMake project

我在 QT Creator 中创建了一个非 Qt 项目,Plain C++ Application。我当前的文件夹结构是这样的:

.
├── client
│   ├── client.cpp
│   └── client.h
├── CMakeLists.txt
├── CMakeLists.txt.user
├── main.cpp
└── server
    ├── server.cpp
    └── server.h

我的 CMakeLists.txt 文件如下所示:

cmake_minimum_required(VERSION 3.5)

project(eshraagh-project LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(eshraagh-project main.cpp server/server.h server/server.cpp client/client.h client/client.cpp)

在我的主文件中,我包含了 server.h 和 client.h 并创建了它们的实例,并且没有给出任何错误。

当我尝试使用外部库 (this library) 时出现问题。我不知道如何使用它。

我试图将其src文件夹(cpnet-export.h、cpnet-network.h和cpnet-network.c)的内容复制到我的项目中并将它们添加到CMakeLists中,就像我对服务器和客户端文件进行了处理,但它不起作用。我复制了存储库的服务器部分并将其粘贴到我的主目录中,但它给我错误,例如 undefined reference to 'cpnet_bind' 等等(注意:存储库使用带有 net 前缀的函数,但 QT 推荐者告诉我写cpnet 前缀。我不知道为什么会这样。

CMake 中链接可执行文件的库是通过使用target_link_libraries 函数实现的。在你的情况下,

target_link_libraries(eshraagh-project PRIVATE cpnet)

在这里,cpnet 可以是您 CMake 项目知道的目标的名称(否则,它会变成某种特定于平台的 -lcpnet 链接器标志)。为了让 CMake 了解 cpnet 图书馆,您可以

  • 将外部库源添加到您的项目中(作为 git submodule,或者通过自己跟踪它们),对于这个例子,假设它们的源位于 lib/cpnet
  • 告诉 CMake 包含该文件夹中的配置说明。如果外部项目也使用 CMake,并且不会混淆全局变量和设置(这似乎是这种情况),这将起作用。

所以在你的顶层 CMakeLists.txt:

add_subdirectory(lib/cpnet)

请注意,这必须在 target_link_libraries 调用之前完成。