【问题标题】:Building a library with an executable that uses it构建一个带有使用它的可执行文件的库
【发布时间】:2014-11-04 04:45:38
【问题描述】:

我有一个库“lib”和一个可执行的“demo”。

我遇到的问题是“演示”无法获取由“lib”设置的lib_INCLUDESlib_LIBS lib 变量。我希望它们设置,因为在demo.h 我做#include <lib.h> 并且它找不到包含。我希望 CMake 将 lib.h 设为全局包含,即将 -I /path/to/the/dir/with/lib.h/ 传递给编译器。


源码树:

- src/
  - CMakeLists.txt
  - lib/
    - CMakeLists.txt
    - lib.cpp
    - lib.h
  - demo/
    - CMakeLists.txt
    - demo.cpp
    - demo.h

src/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(test)

add_subdirectory(lib)
add_subdirectory(demo)

src/lib/CMakeLists.txt

add_library(lib SHARED lib.h lib.cpp)
target_include_directories(lib ${CMAKE_CURRENT_SOURCE_DIR})

# defined for later use in src/demo/CMakeLists.txt
set(lib_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR})
set(lib_LIBS lib)

src/demo/CMakeLists.txt

include_directories(${lib_INCLUDES})
add_executable(demo demo.h demo.cpp)
target_link_libraries(demo ${lib_LIBS})

# empty! why?
message(STATUS ${lib_INCLUDES})

告诉我“demo”如何访问由“lib”设置的lib_INCLUDESlib_LIBS 库,它们在src/demo/CMakeLists.txt 中似乎是空的。

我不希望src/demo/CMakeLists.txt 包含指向“lib”的路径,只有src/lib/CMakeLists.txt 应该知道“lib”的详细信息,并且它应该定义用于隐藏所有这些详细信息的 src/demo/CMakeLists.txt 中使用的好变量。

如果可能,请在您的答案中包含一个有效的 CMakeLists.txt。

【问题讨论】:

    标签: windows cmake mingw-w64


    【解决方案1】:

    请仔细阅读SET 命令的文档。您的变量 lib_INCLUDES 具有 lib\CMakeLists.txt 的本地范围,因此例如您可以缓存它。

    更好的方法是用

    填充 INTERFACE_INCLUDE_DIRECTORIESlib
    target_include_directories(lib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
    

    所以target_link_libraries 会自动附加 lib 的包含目录。

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2020-07-20
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多