2016-03-23 2 views
10

私はCMakeをビルドツールとして使用し、私と同僚が使うためのシンプルなテンプレートを作成しました。私がベストプラクティスを簡単にオンラインで検索したとき、私は図書館を作るためにさまざまなアプローチに出会った。CMakeのADD_LIBRARY/ADD_EXECUTABLEコマンドにヘッダーファイルを追加する理由

このテンプレートでは、ヘッダーファイルとソースファイルを2つの別々の変数にリストしていますが、ヘッダーをadd_libraryコマンドに渡すわけではありません。そして、私はset_target_propertiesPUBLIC_HEADER変数を使ってヘッダファイルリストを与えます。

これまでのところうまくいくようですが、私が不必要に複雑にしているのではないかと思います。いくつかの人々は、add_libraryコマンドにもヘッダファイルを与えますが、set_target_propertiesなども使用しません。要するに

  • 我々はadd_libraryにヘッダファイルをインクルードしたりすべきではない私たち(ベストプラクティスなど)必要がありますか? 2つの使用法の影響。
  • add_library/add_executableでヘッダーを追加することによってどのような目的が果たされますか?彼らはそれがなくても働いているように見えます(前方宣言とシンボルのみのようです)。ご理解の上でご確認ください。

(ここで私たちはあなたの「シンプル」な方法を使用私たちのプロジェクトで

cmake_minimum_required(VERSION 3.1.0) 

project(lae CXX C) 
set(CMAKE_CXX_STANDARD 14) 

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR} 
) 

set(SOURCE_FILES 
    ... 
) 

set(HEADER_FILES 
    ... 
) 

set(PRIVATE_HEADER_FILES 
    ... 
) 

add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES}) 

set(REQUIRED_LIBRARIES 
    ... 
) 

target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBRARIES}) 

SET_TARGET_PROPERTIES( 
    ${PROJECT_NAME} 
PROPERTIES 
    FRAMEWORK ON 
    SOVERSION 0 
    VERSION 0.1.0 
    PUBLIC_HEADER "${HEADER_FILES}" 
    PRIVATE_HEADER "${PRIVATE_HEADER_FILES}" 
    ARCHIVE_OUTPUT_DIRECTORY "lib" 
    LIBRARY_OUTPUT_DIRECTORY "lib" 
    OUTPUT_NAME ${PROJECT_NAME} 
) 

答えて

4

:)について話しているテンプレートです - ヘッダとソースの両方でadd_libraryが。

ソースのみを追加すると、IDEで生成されたプロジェクトにヘッダーが表示されません。

ただし、インストール時に、我々は2つのinstallのコマンドを使用して、そのようにそれをしなければならない:あなたは、単一のコマンドとしてそれをしたい場合は、あなたが示唆したよう

install(TARGETS library_name 
     LIBRARY DESTINATION lib) 

install(FILES ${PUBLIC_HEADERS} 
     DESTINATION include/library_name) 

を、あなたは、PUBLIC_HEADERset_target_propertiesを使用することができます。 はその後、installのこの種は可能です:

install(TARGETS library_name 
     LIBRARY DESTINATION lib 
     PUBLIC_HEADER DESTINATION include/library_name) 

は、あなたが最も好きなものを選択し、それに固執します。

+0

私は両方をマージした方法が好きでした!また、エクスポートオプションがEclipse CDTを使用している場合、あなたが言及したことを見ました(プロジェクトファイルはヘッダーのものを省略します)。私はあなたの解決策に固執すると思います。ありがとう! –

+0

add_libraryに「ヘッダ」が追加/追加されていない場合、「インストール」の第2の方法は動作していないようです。それはビルドメイク時に 'no targets specified、no makefile found'という文句を言います。どんな手掛かり? – parasrish

+0

@parasrish SET_TARGET_PROPERTIESコマンドでヘッダーを定義しないと、ヘッダーが定義されていないため、ヘッダーは機能しません。ただし、「パブリックヘッダー」を正しく設定してSET_TARGET_PROPERTIESを実行すると、インストールターゲットが正しく動作するはずです。 –

関連する問題