CMake:将子目录中的静态库链接到另一个子目录中的可执行文件

时间:2017-02-16 06:27:46

标签: c++ 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中定义的符号。但是,出于某种原因,当尝试链接到可执行文件A时,CMake无法找到我的库runnerA

我包含了剩下的代码,因为它编译得很好。我能够毫无问题地构建可执行文件runnerB。我推断runnerB有效,因为源文件位于我的src文件夹中,该文件夹是我的exe文件夹的父文件夹,因此B库范围包括{{ 1}}。

如何让CMake知道在哪里找到我的exe库,以便在将其链接到A中的runnerA时可以找到它? < / p>

PROJECT_ROOT

src/exe

PROJECT_ROOT / SRC

cmake_minimum_required(VERSION 2.8)
project(MyProject)

add_subdirectory(src)

PROJECT_ROOT / SRC / EXT

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 / outside_module

add_subdirectory(outside_module)

PROJECT_ROOT / SRC / EXE

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}
)

1 个答案:

答案 0 :(得分:1)

是的,您在嵌套的CMakeLists.txt中设置了${A_LIBS}变量。解决方案是将set() commandPARENT_SCOPECACHE关键字一起使用。