我担心我的问题可能很愚蠢,但由于我是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(只在Ubuntu上用gcc测试)。简而言之,它下载libnet、配置libnet、构建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)

10-04 12:21