【问题标题】:include_directories for imported library导入库的 include_directories
【发布时间】:2018-01-20 12:01:06
【问题描述】:

我正在用 c++ 编写项目,但在 cmake 中导入库时遇到问题。正在导入的第三方库不传播包含目录。

根目录 /CMakeLists.txt

# Top level CMakeLists.txt

cmake_minimum_required(VERSION 3.9.2 FATAL_ERROR)
project(camera_calib)

add_subdirectory(${PROJECT_SOURCE_DIR}/nana)

file(GLOB SRC "${PROJECT_SOURCE_DIR}/src/*.cpp")

add_executable(camera_calib_exe ${SRC})

target_include_directories(camera_calib_exe PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(camera_calib_exe nana_lib)

/nana/CMakeLists.txt

# nana c++ gui CMakeLists.txt

cmake_minimum_required(VERSION 3.9.2 FATAL_ERROR)
project(nana VERSION 1.5.6 LANGUAGES CXX)

add_library(nana_lib STATIC IMPORTED)
set_property(TARGET nana_lib PROPERTY IMPORTED_IMPLIB_DEBUG ${PROJECT_SOURCE_DIR}/lib/nana_v141_Debug_x64.lib)
set_property(TARGET nana_lib PROPERTY IMPORTED_IMPLIB_RELEASE ${PROJECT_SOURCE_DIR}/lib/nana_v141_Release_x64.lib)
set_property(TARGET nana_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/include)
#set_property(TARGET nana_lib PROPERTY INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/include)

代码示例/src/main.cpp

#include <nana/gui.hpp>
#include <nana/gui/widgets/label.hpp>
#include <nana/gui/widgets/button.hpp>

int main(int argc, char** argv)
{
    nana::form fm(nana::rectangle(0, 0, 1900, 1000));
    fm.caption("Camera Calibration");

    nana::button btn_openCam(fm, nana::rectangle(1770, 20, 100, 30));
    btn_openCam.caption("Open cameras");
    btn_openCam.events().click(nana::API::exit_all);

    nana::button btn_closeCam(fm, nana::rectangle(1770, 20 + 30 + 20, 100, 30));
    btn_closeCam.enabled(false);
    btn_closeCam.caption("Close cameras");
    btn_closeCam.events().click(nana::API::exit_all);

    nana::button btn_exit(fm, nana::rectangle(1770, 900, 100, 30));
    btn_exit.caption("Exit");
    btn_exit.events().click(nana::API::exit_all);
    fm.show();
    nana::exec();

    std::cout << "lala";
    return 0;

}

错误列表是:

E1696   cannot open source file "nana/gui.hpp"
E1696   cannot open source file "nana/gui/widgets/label.hpp"
E1696   cannot open source file "nana/gui/widgets/button.hpp"

为什么 nana_lib 目标不传播 camera_calib_exe 目标的包含目录? 如何解决这个问题?

提前谢谢你。

【问题讨论】:

  • add_subdirectory(nana)add_subdirectory(${PROJECT_SOURCE_DIR}/nana) 稍微干净一些;路径无论如何都是相对的

标签: c++ cmake nana


【解决方案1】:

导入目标的范围很重要。尝试将GLOBAL 选项添加到add_library()

add_library(nana_lib STATIC IMPORTED GLOBAL)

“目标名称在创建它的目录及以下目录中具有范围,但 GLOBAL 选项扩展了可见性。”

参考

【讨论】:

  • 这样污染全局项目配置是不是有点不对劲?不应该用find_package 代替吗?
  • @VTT 但即使find_package() 也会在您的主范围中添加类似nana_lib 的目标。所以不,我看不出有什么不同。从显示的nana/CMakeLists.txt 来看,CMake 并不打算找到它(没有nanaConfig.cmake)。我承认我没有检查nana C++ library 来查看他们关于“如何将他们的库包含在现有项目中”的建议。但看起来显示的nana/CMakeLists.txt 不是官方的。
  • @VTT find_package 仅在其他人已经花时间生成定义库的所有目标属性的 cmake 文件时才有效。如果没有 cmake 文件,那么显而易见的做法是自己定义目标。
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多