如何将外部库与 CMake 项目链接

时间:2021-05-17 11:59:53

标签: c++ cmake linker qt-creator

我在 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 前缀。我不知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

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 之前完成。