2016-09-18 71 views
0

各ターゲットに固有のヘッダファイルstdafx.hがプリコンパイルされています。CMakeで明示的なヘッダファイルを指定する

include_directories(<prefix>/include_a) 
include_directories(<prefix>/include_b) #<---- contains stdafx.h that should NOT be used 
include_directories(<project_dir>/) #<----- contains stdafx.h that should be used 

add_executable(<project_name> <sources>) 

問題:私のcmakeのプロジェクトは、おおよそ以下のようになります。私は<prefix>/include_bディレクトリの一部として提供されますプリコンパイル済みヘッダーを除外したいです。それが不可能な場合は、ヘッダファイルを明示的に指定してください。私はgcc-includeオプションをサポートしていますが、私の要件に合ったCMakeのクリーナーオプションはありますか?あなたが(明示的にCMakeによってサポートされていない)インクルードファイルを強制したくない場合は

+0

ますもしドンインクルードファイルを強制したくないCMakeによって明示的にサポートされていません。例えば、 [ここ](http://stackoverflow.com/questions/32773283/cmake-include-header-into-every-source-file))、私はあなたのインクルードパスの順序で答えると思う。この例は、["CMake Build System:Transitive Usage Requirements"のドキュメント(https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#transitive-usage-requirements)に隠されています。 ):例えば、 "ターゲットのリンクされたライブラリをlib1 lib2 lib3の順で指定しなければならないが、インクルードディレクトリは..."を参照してください。 – Florian

+0

'stdafx.h'はVisual Studioのようなにおいがしますが、msvcタグは入れていませんか? –

+0

@Florianはこれを更新するのを忘れました。 – PnotNP

答えて

0

答え

に私のコメントを参照すると、私は答えはあなた含めるパスの順に産むと思います。ここではまず

は、私はあなたの問題を再現するために使用されるテストコードです:インクルードの順序に影響を与えるために

cmake_minimum_required(VERSION 3.0) 
project(IncDirOrder) 

file(WRITE "prefix/include_a/stdafx.h" "#error include_a/stdafx.h") 
file(WRITE "prefix/include_b/stdafx.h" "#error include_b/stdafx.h") 
file(WRITE "include/stdafx.h" "") 
file(WRITE "main.cpp" "#include \"stdafx.h\"\nint main() { return 0; }") 

include_directories(prefix/include_a) 
include_directories(prefix/include_b) 
include_directories(include) 

add_executable(${PROJECT_NAME} main.cpp) 

可能な解決策パス

  1. include_directories()呼び出しの順序を変更する(可能な場合) :

    include_directories(include) 
    include_directories(prefix/include_a) 
    include_directories(prefix/include_b) 
    
  2. BEFOREキーワードの使用:

    include_directories(BEFORE include) 
    

    または

    target_include_directories(${PROJECT_NAME} BEFORE PUBLIC include) 
    
  3. 他、プリコンパイルヘッダはまた、ライブラリーを伴っているという仮定で行く、私は一般の使用をお勧めしますtarget_include_directories()。そして、あなたは自動的に必要な行動を持っている(ローカルインターフェイスが含まれる前に、最初に来るのか含まれます):

    cmake_minimum_required(VERSION 3.0) 
    project(IncDirOrderWithLibs) 
    
    file(WRITE "prefix/source_a/stdafx.cpp" "#define LibA\n#include \"stdafx.h\"") 
    file(WRITE "prefix/include_a/stdafx.h" "#ifndef LibA\n#error include_a/stdafx.h\n#endif") 
    file(WRITE "prefix/source_b/stdafx.cpp" "#define LibB\n#include \"stdafx.h\"") 
    file(WRITE "prefix/include_b/stdafx.h" "#ifndef LibB\n#error include_b/stdafx.h\n#endif") 
    file(WRITE "include/stdafx.h" "") 
    file(WRITE "main.cpp" "#include \"stdafx.h\"\nint main() { return 0; }") 
    
    add_library(LibA "prefix/source_a/stdafx.cpp") 
    target_include_directories(LibA PUBLIC prefix/include_a) 
    
    add_library(LibB "prefix/source_b/stdafx.cpp") 
    target_link_libraries(LibB LibA) 
    target_include_directories(LibB PUBLIC prefix/include_b) 
    
    add_executable(${PROJECT_NAME} main.cpp) 
    target_link_libraries(${PROJECT_NAME} LibB) 
    target_include_directories(${PROJECT_NAME} PRIVATE include) 
    

参照

関連する問題