gpt4 book ai didi

c - 如何将 libnet 与 cmake(和 kdevelop)一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:18 25 4
gpt4 key购买 nike

恐怕我的问题可能很愚蠢,但由于我是 kdevelop 和 cmake 的新手,所以我很难理解它们是如何工作的。我尝试设置的项目使用 libnet 1.1 库。我的问题是如何让 cmake 编译和链接这个库,以便我可以正确使用它?

这是我已经尝试过的:

PROJECT(test)

include_directories("${PROJECT_SOURCE_DIR}/libnet")
add_subdirectory(libnet)

ADD_EXECUTABLE(test main.c)
target_link_libraries(test libnet)

感谢您的帮助!

最佳答案

看起来 libnet 本身不使用 CMake,因此您将不得不单独构建它或将其作为您自己项目的一部分。

要单独构建它,您有几个选择。您可以构建它(并根据需要安装它)然后使用 find_library找到实际的 libnet.a/libnet.lib 文件。

find_library(libnet NAMES net libnet PATHS <wherever you built it to>)
include_directories(<wherever you built it to>/include)
target_link_libraries(test libnet)

CMake 提供了一种通过使用 ExternalProject_Add 实现自动化的好方法。 .这使用起来有点棘手,但您可以在一个命令中下载、提取、构建和安装 libnet。看起来 libnet 有几种不同的构建方式,具体取决于平台,所以这可能不是太简单。

另一种选择是将 libnet 源包含在您自己的项目中,并通过 add_library 将其添加为库。 .您需要创建一个 libnet 源列表,并检查 libnet makefile 以检查是否有任何需要在您自己的 CMakeLists.txt 中进行特殊处理的编译器标志/异常情况

这可能是最好的选择,因为它使您可以访问 IDE 中的完整 libnet 源代码树,允许您微调 libnet 构建,并导致您自己的项目过时(需要重建)如果libnet 构建更改。

set(LibnetSources <list all sources and headers>)
add_library(libnet ${LibnetSources})
include_directories(${PROJECT_SOURCE_DIR}/libnet/include)
target_link_libraries(test libnet)

可以利用file(GLOB...)以帮助生成 libnet 源列表,但不建议这样做,因为 CMake 不会自动检测到文件的添加或删除。您需要确保如果执行此操作,您会在尝试重新编译之前手动重新运行 cmake。如果您不打算添加/删除任何 libnet 文件,这不是问题。


编辑:使用外部项目模块

好吧,还有第三个选项,这可能是最好的,但设置起来可能有点复杂;使用 CMake 的 ExternalProject Module .这是为了允许构建外部依赖项——即使是那些不使用 CMake 的依赖项。这是 decent article关于使用它。

尝试用这个替换您的 CMakeLists.txt(仅在带有 gcc 的 Ubuntu 上测试过)。简而言之,它下载 libnet、配置它、构建它并将其安装到您的构建树(而不是/usr/local)。然后您的可执行文件可以包含并链接到它。

# Minimum version 2.8.5 since we need ExternalProject module
cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR)
project(test)

# Enable ExternalProject CMake module
include(ExternalProject)

# Set default ExternalProject root directory
set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/ThirdParty)

# Add libnet
ExternalProject_Add(
libnet
URL http://packetfactory.openwall.net/libnet/dist/libnet.tar.gz
TIMEOUT 30
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
BUILD_IN_SOURCE ON
# Wrap download, configure, build and install steps in a script to log output
LOG_DOWNLOAD ON
LOG_CONFIGURE ON
LOG_BUILD ON
LOG_INSTALL ON)

# Specify include dir
ExternalProject_Get_Property(libnet install_dir)
include_directories(${install_dir}/include)

# Add test executable target
add_executable(test main.c)

# Create dependency of test on libnet
add_dependencies(test libnet)

# Specify test's link libraries
target_link_libraries(test ${install_dir}/lib/libnet.a)

关于c - 如何将 libnet 与 cmake(和 kdevelop)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14415875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com