我有两个C ++库,我在Ubuntu上使用它。其中一个,我们称之为foo
,我通过apt-get安装,例如sudo apt-get install libfoo-dev
。另一个,让我们称之为bar
,我通过下载源文件并运行make install
来安装。完成这些安装后,我会在foo
等/usr/include/foo/foo.h
的位置提供头文件,在bar
等位置提供来自/usr/local/include/bar/bar.h
的头文件。据我所知,foo
是bar
的依赖关系。
然后我创建了自己的C ++项目,并包含了行#include "bar/bar.h"
。但是在编译我的项目时,我收到一条错误error: foo.h: No such file or directory
。如果我在调试器中单击错误,它会打开文件bar.h
,并突出显示行#include <foo.h>
。因此,我的项目能够找到bar.h
,但不能找到foo.h
。我在foo
文件中未提及bar
或CMakeLists.txt
。
所以我的问题是:
我的项目如何知道如何找到bar.h
,当我还没有告诉它在CMakeLists.txt
找到它的位置?
我需要做些什么才能让我的项目找到foo.h
并正确编译?
谢谢!
编辑:这是我的CMakeLists.txt
文件(foo
和bar
库都不是这里提到的文件夹):
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)
答案 0 :(得分:2)
您需要在编译命令中添加选项-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/
。