【问题标题】:My project can find one library header, but not another one我的项目可以找到一个库头,但找不到另一个
【发布时间】:2016-06-02 12:11:17
【问题描述】:

我有两个 C++ 库,我在 Ubuntu 上使用它们。其中之一,我们称之为foo,我通过apt-get 安装,例如sudo apt-get install libfoo-dev。另一个,我们称之为bar,我通过下载源文件安装,然后运行make install。在这些安装之后,我在/usr/include/foo/foo.h 等位置拥有来自foo 的头文件,在/usr/local/include/bar/bar.h 等位置拥有来自bar 的头文件。据我所知,foobar 的依赖项。

然后我创建了自己的 C++ 项目,并包含了 #include "bar/bar.h" 行。但是在编译我的项目时,我收到一条错误消息error: foo.h: No such file or directory。如果我在调试器中单击错误,它会打开文件bar.h,并突出显示#include <foo.h> 行。所以,我的项目能够找到bar.h,但不能找到foo.h。我的CMakeLists.txt 文件中没有提及foobar

所以我的问题是:

  1. 我的项目如何知道如何找到bar.h,而我没有告诉它在CMakeLists.txt 中的哪里可以找到它?

  2. 我需要做什么才能让我的项目找到foo.h 并正确编译?

谢谢!


编辑:这是我的 CMakeLists.txt 文件(foobar 库不是这里提到的):

cmake_minimum_required(VERSION 2.8.1)

set(CMAKE_CXX_FLAGS "-std=c++11 -O3")

project(Grasping_Simulator)

find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(GLUT REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(Boost REQUIRED)
find_package(OpenCV REQUIRED)

include_directories(${OPENGL_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${GLUT_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${OPENCV_INCLUDE_DIRS})

file(GLOB SRCS *.cpp *.h)

add_executable(${PROJECT_NAME} ${SRCS})

target_link_libraries(${PROJECT_NAME} ${GLEW_LIBRARY} ${GLUT_LIBRARY} ${OpenCV_LIBS} pthread GL boost_system)

【问题讨论】:

  • 它可以安装在 /usr/include 中。以详细模式运行所有内容并验证包含路径的命令行参数。
  • /usr/include/usr/local/include 等一些特殊路径在C_INCLUDE_PATHCPLUS_INCLUDE_PATH 等环境变量中预先设置。
  • 您能否添加您的CMakeLists.txt(或它的最小版本)?只是一个猜测:你在某个地方有一个find_package()。较新的版本正在使用INTERFACE_INCLUDE_DIRECTORIES,库可以在其中传播其包含目录。
  • 我添加了CMakeLists.txt。也许它正在寻找的库之一正在帮助找到bar.h
  • @Karnivaurus 谢谢。您可以使用message(${OPENGL_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${GLUT_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${OPENCV_INCLUDE_DIRS}) 或列出所有INTERFACE_INCLUDE_DIRECTORIES 并使用foreach(lib IN ITEMS ${GLEW_LIBRARY} ${GLUT_LIBRARY} ${OpenCV_LIBS} pthread GL boost_system)|get_target_property(prop ${lib} INTERFACE_INCLUDE_DIRECTORIES)|message("${lib}: ${prop}")|endforeach() 之类的内容检查bar

标签: c++ ubuntu cmake


【解决方案1】:

您需要在编译命令中添加选项-I/usr/include/foo/

默认情况下,/usr/include//usr/local/include 等位置已在包含搜索路径中。但是,您的库 bar 使用 #include <foo.h> 做了一些顽皮的事情。真的,它应该使用#include <foo/foo.h> 之类的东西(顺便说一句,如果你能做出这样的改变会更干净)。这将允许编译器搜索其所有包含路径,包括路径/usr/include/,并尝试附加/foo/foo.h - 这将成功。就目前而言,默认包含路径中没有任何内容可以仅通过附加 /foo.h 来工作,因此无法找到它。

编辑:鉴于上面的 CMake 代码,很可能您需要将包含值 /usr/include/foo 的变量附加到 include_directories 行以达到预期的效果(这是包含-I/usr/include/foo/ 在编译行)。

【讨论】:

  • 谢谢,这是有道理的。但是,bar 是一个相当成熟的库,所以如果这是他们编码错误的结果,我会感到惊讶......也许在安装过程中我错过了一些额外的说明......
  • 他们很可能只是希望您使用选项-I/usr/include/foo/。这并没有什么特别可怕的,很多“成熟的图书馆”都会做类似的事情。它不是最干净的设计,但很少有图书馆是“最干净的”
  • @Karnivaurus:问题是bar 开发人员可能在他们的机器(或Windows 系统上的任何其他位置)上的/usr/include 中有foo.h。但是,在您的发行版上,位置不同。这就是为什么会出现问题。正如 Smeeheey 所说,foo/foo.h 是最正确的选择。如果我是你,我会在我的计算机上修补 bar 以修复路径。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多