1

私が持っている質問はばかげているかもしれませんが、私はkdevelopとcmakeに慣れていないので、それらがどのように機能するかを理解するのは非常に困難です。私がセットアップしようとしたプロジェクトは、libnet1.1ライブラリを使用しています。私の質問は、cmakeにこのライブラリをコンパイルしてリンクさせ、正しく使用できるようにするにはどうすればよいですか?

これが私がすでに試したことです:

PROJECT(test)

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

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

ご協力ありがとうございました!

4

1 に答える 1

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のダウンロード、抽出、ビルド、インストールをすべて1つのコマンドで実行できます。ただし、プラットフォームに応じて、libnetにはいくつかの異なる構築方法があるように見えるため、これはそれほど単純ではない場合があります。

もう1つのオプションは、独自のプロジェクトに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)

libnetソースのリストの生成に役立てることができますが、ファイルの追加または削除はCMakeによって自動的に検出されないため、お勧めしませんfile(GLOB...)これを行う場合は、再コンパイルを試みる前に、cmakeを手動で再実行することを確認する必要があります。libnetファイルを追加/削除する予定がない場合、これは問題ではありません。


編集:ExternalProjectモジュールを使用

OK、おそらく最良の3番目のオプションがありますが、設定が少し複雑になる可能性があります。CMakeのExternalProjectモジュールを使用します。これは、CMakeを使用しないものでも、外部の依存関係を構築できるように設計されています。これはそれを使用することについてのまともな記事です。

CMakeLists.txtをこれに置き換えてみてください(Ubuntuでgccを使用してのみテストされています)。つまり、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)
于 2013-01-19T18:10:26.000 に答える