2017-04-17 7 views
1

私は適度なサイズのC++ライブラリを構築していて、の違いを理解しようとしていた私のCMakeLists.txtファイル命令対target_link_librariesです。CMake: `include_directories`と` target_link_libraries`の違いは何ですか

私は以下のコードをいくつか挙げていますが、コメントを控えておきたいだけです。私はBoostライブラリを使用して私のコードを構築しています。だから私は、INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})ビルドプロセスでBoostソースディレクトリを含める指示があります。だから私は、Cmakeは、追加の明示的な指示なしで、実行可能ファイルをビルドするときにこれらのBoost Sourceファイルを含めると仮定します。

しかし、後で実行可能ファイルをビルドするときにTARGET_LINK_LIBRARIES(gd_validator ${Boost_LIBRARIES})があります。つまり、私はBoostディレクトリをインクルードするだけでなく、明示的に実行可能ファイルにリンクする必要があることを示唆しています。

私は実際に両方のステップが必要かどうか、またはINCLUDE_DIRECTORIES命令が必要だったのかどうかはわかりませんでした。

cmake_minimum_required(VERSION 3.7) 
project(XXX) 
find_package(Boost 1.58.0 REQUIRED COMPONENTS system filesystem program_options chrono timer date_time REQUIRED) 
if(NOT Boost_FOUND) 
    message(FATAL_ERROR "NOTICE: This demo requires Boost and will not be compiled.") 
endif() 
set(Boost_USE_STATIC_LIBS  ON) 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) 

file(GLOB lib_SRC RELATIVE "lib/" "*.h" "*.cpp") 
file(GLOB test_SRC RELATIVE "tests/" "*.h" "*.cpp") 

# need to fix the instruction below to reference library 
set(SOURCE_FILES ${lib_SRC} tests/testComplexCreator.cpp tests/testDataFormatter.cpp tests/testComplexAnalysis.cpp tests/testFascadeClass.cpp) 
add_library(libXXX SHARED ${SOURCE_FILES})  
add_executable(${PROJECT_NAME} main.cpp random_mat_vector_generator.h random_mat_vector_generator.cpp) 
add_executable(gd_validator gudhi_validator.cpp) 
TARGET_LINK_LIBRARIES(gd_validator ${Boost_LIBRARIES}) 

答えて

3

はい、両方が必要です。

include_directoriesは、ヘッダーファイル(この場合は、ブーストライブラリのヘッダーファイル)を検索する場所をコンパイラに指示します。

target_link_librariesは、実行可能ファイルとリンクするライブラリをリンカーに指示します。

ヘッダーはライブラリにアクセスするためのインターフェイスだけを提供しますが、ライブラリ自体はプリコンパイルされ、アプリケーションにリンクされます。

+0

よろしいですか?したがって、あなたが何を言っているのかを理解すると、 'target_link_libraries'はターゲットライブラリのヘッダー/ソースをプリコンパイルし、それを自分のアプリケーションとリンクします。あれは正しいですか? – krishnab

+0

実際には、ライブラリはすでにプリコンパイルされています。コンパイラはあなたのコードでライブラリの使用法を探し、それを単に呼び出す(共有ライブラリ)か、実際のライブラリコード(静的ライブラリ)で置き換えるだけです。ライブラリを使用するポイントは、不要なコンパイルを避けることです。 ライブラリがヘッダのみの場合に '' target_link_libraries''を追加する必要はありません –

+0

これは素晴らしいことです。ええ、それは私が不思議に思っていたものです。明らかにしてくれてありがとう。 – krishnab

0

include_directoriesインクルードファイル(ヘッダ)のために検索するディレクトリを指定します。 target_link_librariesは、ターゲット(実行可能ファイルまたはライブラリ)にリンクするライブラリを指定します。 2つの全く異なるもの。

+0

ええ、これは私が不思議に思っていたものです。 'target_link_libraries'はすでにコンパイルされたライブラリだけを参照していますか?通常、私はすべてのBoostヘッダとソースファイルを持つディレクトリを指しています。そしてコンパイラはこれらのファイルに対してビルドします。コンパイルされたライブラリを指している場合は 'target_link_libraries'だけ必要ですか? – krishnab

+0

'target_link_libraries'はリンクするよりもずっと多くのことをしています。たとえば、インクルードディレクトリを検索します。 – juanchopanza

+0

コンパイル時にインクルードファイルが使用されます。ライブラリは後でリンクされます。混乱は何ですか?コンパイラがインクルードする場所を指す必要があります。リンクするライブラリのリンカを指す必要もあります。これらはまったく異なるもので、あなたがしたいことに応じて、どちらか一方または両方を行う必要があります。 –

関連する問題