如何 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
调用之前完成。
我在 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
调用之前完成。