【发布时间】: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 的头文件。据我所知,foo 是 bar 的依赖项。
然后我创建了自己的 C++ 项目,并包含了 #include "bar/bar.h" 行。但是在编译我的项目时,我收到一条错误消息error: foo.h: No such file or directory。如果我在调试器中单击错误,它会打开文件bar.h,并突出显示#include <foo.h> 行。所以,我的项目能够找到bar.h,但不能找到foo.h。我的CMakeLists.txt 文件中没有提及foo 或bar。
所以我的问题是:
我的项目如何知道如何找到
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)
【问题讨论】:
-
它可以安装在 /usr/include 中。以详细模式运行所有内容并验证包含路径的命令行参数。
-
/usr/include和/usr/local/include等一些特殊路径在C_INCLUDE_PATH或CPLUS_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