我担心我的问题可能是愚蠢的,但由于我是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)
感谢您的帮助!
答案 0 :(得分:1)
看起来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)