自分のコードとコンパイルが必要な外部コードの両方を使用するプロジェクトがあります。私のファイルツリーは以下の通りです。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/exe
にrunnerA
にそれをリンクするとき、それはそれを見つけることができるように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/)
実行ファイルをA: 'target_link_libraries(runnerA A)'にリンクする必要があります。 – arrowd
@arrowd:しました。 'PROJECT_ROOT/src/exe'セクションのために私のコードに入れてください。今すぐ修正されました – marcman
@arrowd:それは、実際には範囲の問題だと言われています。私のCMakeコマンドはランナーBのために働くので – marcman