【问题标题】:CMAKE: Library Missing Header FileCMAKE:库缺少头文件
【发布时间】:2017-01-22 03:32:14
【问题描述】:

我有一个子目录,它创建了一个共享库,该库构建到我的根项目的文件夹中。我将它链接到我的 cmake 文件中没有任何问题。但是,无论我怎么重新配置,编译器都找不到头文件。

文件夹结构类似于:

  • 构建
    • 图书馆
  • 测试
    • library_test

基本上我想将编译的库链接到 lib 文件夹以链接到它的测试。但是,无论我如何配置 CMakelists,在编译过程中都找不到库的头文件。但是,在 cmake 过程中没有错误。 实际的错误信息如下:

致命错误:找不到“file.h”文件

我最近的尝试:

find_library(LESSIONS_LIBS chp_two PATHS {CMAKE_SOURCE_DIR}/build/lib/)
add_library(test_chptwo SHARED ${TEST})
target_link_libraries(test_chptwo gtest LESSIONS_LIBS)

有什么想法吗?


编辑一个

这是我更新的 CMakelists:

CMakeLists 库:

cmake_minimum_required(VERSION 3.7.0)

#Project Name
project (chp_two)

#Build Problem Sets as Library
#Header Files 
include_directories(include ${CMAKE_CURRENT_SOURCE_DIR}/inc/)
#Source files
set(LIB random_queue.cpp ${include})
add_library(chp_two SHARED ${LIB})

测试 CMakeLists:

cmake_minimum_required(VERSION 3.7.0)

#Project Name
project(TESTING)

#Setting Test sources
set(TEST test_random_queue.cpp)

#Search for libraries
find_library(LESSIONS_LIBS chp_two PATHS {CMAKE_SOURCE_DIR}/build/lib/)

enable_testing()

#turn test into a library
add_library(test_chptwo SHARED ${TEST})

target_link_libraries(test_chptwo gtest LESSIONS_LIBS) 

【问题讨论】:

  • 哪个项目导致错误:一个用于library,还是一个用于test?将此信息添加到问题中。
  • CMake include path的可能重复
  • 你解决了吗?
  • @Rexcirus 不,我无法弄清楚。
  • 您应该改用 target_include_directories。

标签: c++ linker cmake header-files


【解决方案1】:

如果没有您的 cmake 文件,很难确定。但是,您是否会错过 include_directories 调用?此调用将设置 .h 文件的路径以进行编译。

include_directories (path_to_my_headers)

下面是我在 cmets 中所指的 CMAKE 示例。无论如何,相同的概念或多或少都适用于两个 libs/exe。

cmake_minimum_required(VERSION 3.7.0)
# 
project (MyProj)
#
include_directories (.)
include_directories (path_to_a_dir_with_files_I_need)
include_directories (path_to_another_dir_with_files_I_need)

#
file (GLOB HEADERS *.h)
file (GLOB SOURCES *.cpp)

# Finish with your CXX flags, add_executable, target_link_libraries, install, etc

【讨论】:

  • 我在图书馆的 CMakelist 中做到了这一点。我必须在链接到的每个文件中重新包含该库的标头吗?
  • 您的共享库具有在标头中定义的功能。链接到 lib 是不够的,因为这只有在编译后才有帮助。在调用应用程序中包含标头,以便它知道 lib 中需要最终调用的函数。
  • 用 cmake 和潜在的更大项目处理这个问题的最佳方法是什么?
  • 使用 cmake 没什么大不了的。一次性设置。
  • 完整的 CMakeLists.txt 会有所帮助。如果您有多个 CMakeLists.txt,请提供所有这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多