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库范围包括exe

我如何让CMake知道在哪里可以找到我的A库,以便在将其链接到runnerAin时可以找到它src/exe


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 / ext / 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_LIBS}在嵌套的CMakeLists.txt中设置了该变量。解决方案是将set()命令PARENT_SCOPECACHE关键字一起使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将子目录中的文件链接到Shell脚本中的另一个子目录

CMake:将可执行文件写入多个子目录

将 css 文件从一个子目录复制到 CONTAINER BLOB 中的另一个子目录

创建到一个子目录中包含的文件的硬链接到另一子目录中

CMake:防止在子目录库项目中构建测试可执行文件目标

CMake 将不同子目录中的静态库链接到一个静态库中

将目录中的所有子目录符号链接到另一个目录

根据 Python 中的名称将文件从特定子目录移动到另一个子目录

使用通配符将多个文件从一个子目录复制到另一个子目录

在每个子目录中查找比另一个文件新的文件

如何将文件从一个子目录移动到第一个子目录之外的另一个子目录?

htaccess 将子目录重定向到另一个子目录

如何将子目录移动到同一目录中的另一个子目录中?

将子目录中的文件移动到另一个目录

如何列出Linux中的所有可执行文件(目录,子目录,$ PATH)?

Nginx将一个子目录的所有内容重定向到另一个子目录

如何访问在vb.net的另一个子目录中的一个子目录中声明的变量

WIX:可执行文件在子目录中找不到 dll

如何编写将整个子目录结构复制为另一个子目录结构的shell脚本?

在目录的子目录中编译几个程序,并使用makefile将可执行文件放置在不同的目录中

循环遍历子目录并在每个子目录中执行一个Perl脚本

git将子目录与另一个存储库合并

如何在不丢失父目录的情况下将多个同名文件从子目录复制到另一个目录?

如何将具有特定扩展名的文件从子目录移动到另一个目录,包括使用 CMD 创建文件所在的子目录?

将特定文件从子目录复制到一个目录

将文件从嵌套子目录中复制到另一个文件夹中

.htaccess使用代理从子目录重定向到另一个域

将仓库的分叉子目录作为github中的另一个仓库

如何将匹配文件从目录/子目录复制到另一个目录