私は適度なサイズの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})
よろしいですか?したがって、あなたが何を言っているのかを理解すると、 'target_link_libraries'はターゲットライブラリのヘッダー/ソースをプリコンパイルし、それを自分のアプリケーションとリンクします。あれは正しいですか? – krishnab
実際には、ライブラリはすでにプリコンパイルされています。コンパイラはあなたのコードでライブラリの使用法を探し、それを単に呼び出す(共有ライブラリ)か、実際のライブラリコード(静的ライブラリ)で置き換えるだけです。ライブラリを使用するポイントは、不要なコンパイルを避けることです。 ライブラリがヘッダのみの場合に '' target_link_libraries''を追加する必要はありません –
これは素晴らしいことです。ええ、それは私が不思議に思っていたものです。明らかにしてくれてありがとう。 – krishnab