【问题标题】:How to link an external library with CMake project如何将外部库与 CMake 项目链接
【发布时间】:2021-08-06 16:32:32
【问题描述】:

我在 QT creator 中创建了一个非 Qt 项目,即普通 C++ 应用程序。我目前的文件夹结构是这样的:

.
├── 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 前缀相反。我不知道为什么会这样)。

【问题讨论】:

  • @lubgr 抱歉,我的上一条评论只是一个愚蠢的错误。我修复了它,你可以找到我的新 CMakeLists here。现在它给了我一个新错误:cannot find -llibcpnet.
  • @lubgr 哇,它有效!非常感谢您的宝贵时间! :)
  • @RoozbehSayadi:在 Stack Overflow 上,我们不会在标题中添加“SOLVED”。有一个被接受的答案会适当地为问题着色。顺便说一句,你甚至可以自己写一个答案:stackoverflow.com/help/self-answer.

标签: c++ cmake linker qt-creator


【解决方案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 调用之前完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多