2017-02-16 15 views
0

自分のコードとコンパイルが必要な外部コードの両方を使用するプロジェクトがあります。私のファイルツリーは以下の通りです。CMake:サブディレクトリから別のサブディレクトリにある実行可能ファイルへのスタティックライブラリのリンク

PROJECT_ROOT 
|--CMakeLists.txt 
|--src 
    |--CMakeLists.txt 
    |--B1.cpp 
    |--B1.h 
    |--B2.cpp 
    |--B2.h 
    | 
    |--ext 
    | |--CMakeLists.txt 
    | |--outside_module 
    | | |--CMakeLists.txt 
    | | |--A1.h 
    | | |--A1.cpp 
    | 
    |--exe 
     |--CMakeLists.txt 
     |--runnerA.cpp 
     |--runnerB.cpp 

以下のCMakeList.txtファイルの構造を貼り付けました。私が抱えている問題は、私のrunnerA実行ファイルが、A1.hとA1.cppで定義されているシンボルに未定義の参照エラーをたくさん与えることです。しかし、何らかの理由でCMakeがライブラリAを見つけられませんでした。実行ファイルrunnerAにリンクしようとしました。

コードの残りの部分が含まれています。コンパイル済みであるためです。私は問題なく実行可能ファイルrunnerBをビルドすることができます。私はrunnerBがソースファイルが私のexeフォルダの親である私のsrcフォルダにあるので、Bライブラリスコープにはexeが含まれていると推測しました。

どのように私は私のAライブラリを検索する場所をsrc/exerunnerAにそれをリンクするとき、それはそれを見つけることができるようにCMakeは、知っていることができますか?


PROJECT_ROOT

cmake_minimum_required(VERSION 2.8) 
project(MyProject) 

add_subdirectory(src) 

PROJECT_ROOT/srcに

find_package(Module REQUIRED) 

# CREATE LIBRARIES 
add_library(
    B 
    B1.cpp B1.h 
    B2.cpp B2.h 
) 

# GROUP LIBRARIES TOGETHER 
set(
    B_LIBS 
    B 
    ${Module_LIBS} 
) 


# INCLUDE DIRECTORIES 
set(
    B_INCLUDES 
    . 
    ${Module_INCLUDE_DIRS} 
) 

# ASSIGN INCLUDES TO LIBRARY 
target_include_directories(
    B PUBLIC 
    ${B_INCLUDES} 
) 


add_subdirectory(ext) 
add_subdirectory(exe) 

PROJECT_ROOT/SRC/extに

add_subdirectory(outside_module) 

PROJECT_ROOT/SRC /内線/ outside_module

find_package(Boost COMPONENTS 
    filesystem 
    system 
    log 
    thread 
    REQUIRED) 

# ADD DEFINITIONS 
add_definitions(-DBOOST_LOG_DYN_LINK) # Necessary to compile A with log shared libraries (instead of static) 

# DEFINE LIBRARY 
add_library(
    A 
    A1.cpp A2.h 
) 

# LINK LIBRARIES 
set(
    A_LIBS 
    A 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_LOG_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
    ${Boost_THREAD_LIBRARY} 
) 

# INCLUDE DIRECTORIES 
set(
    A_INCLUDES 
    ${Boost_INCLUDE_DIRS} 
) 

PROJECT_ROOT/SRC/exeファイル

# DEFINE EXECUTABLES 
add_executable(runnerB runnerB.cpp) 
add_executable(runnerA runnerA.cpp) 


################## 
# LINK LIBRARIES 
################## 
target_link_libraries(
    runnerB 
    ${B_LIBS} 
) 

target_link_libraries(
    runnerA 
    ${A_LIBS} 
) 

target_include_directories(
    runnerA PUBLIC 
    ${A_INCLUDES} 
) 

# INSTALLATION 
install(TARGETS runnerB DESTINATION bin/) 
install(TARGETS runnerA DESTINATION bin/) 
+0

実行ファイルをA: 'target_link_libraries(runnerA A)'にリンクする必要があります。 – arrowd

+0

@arrowd:しました。 'PROJECT_ROOT/src/exe'セクションのために私のコードに入れてください。今すぐ修正されました – marcman

+0

@arrowd:それは、実際には範囲の問題だと言われています。私のCMakeコマンドはランナーBのために働くので – marcman

答えて

0

右、あなたは、ネストされたCMakeLists.txtにその${A_LIBS}変数を設定します。解決策は、set() commandPARENT_SCOPEまたはCACHEキーワードで使用することです。

+0

私の場合のように、「祖父母」の範囲が必要なときはどうなりますか? – marcman

+0

'CACHE'を使用すると、' CMakeCache.txt'にエントリが作成され、変数はグローバルになります。 – arrowd

+0

この場合も 'FORCE'を忘れないでください! – arrowd

関連する問題