【发布时间】:2017-01-31 16:06:46
【问题描述】:
在 CMake 中,大多数第三方库根本不需要我指定它们的包含目录......他们似乎在幕后为我处理了这些。但是,一些第三方库似乎将这项工作放在了我的盘子上。
我在第三方库中发现的差异是否表明我做错了什么?还是 CMake 只是一个结构较少的环境,一些第三方库会比其他库更多地握住你的手?这里发生了什么?最佳做法?
我将举几个例子。 OpenCV 让事情变得超级简单,我无需提及它们的包含目录:
set(OpenCV_DIR ${THIRD_PARTY_DIR}/OpenCV)
find_package(OpenCV REQUIRED)
...
add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
但是,Google 的协议缓冲区要求我使用 include_directories 命令才能使用它们的头文件:
set(CMAKE_PREFIX_PATH ${THIRD_PARTY_PROTOBUF_DIR})
find_package(Protobuf ${THIRD_PARTY_DIR}/protobuf-2.6.1)
...
include_directories(${PROTOBUF_INCLUDE_DIRS})
add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})
【问题讨论】:
-
可能,在第一种情况下,您在系统中安装了 OpenCV 作为系统范围的包,因此可以在标准路径中找到标头。尝试卸载它一段时间并再次测试它。让我知道,如果是这样,我会将评论转为答案。 ;-)
-
感谢@skypjack 的回复,但我使用的 OpenCV 和其他第三方库并未安装在系统范围内。我从源代码(或下载的预构建二进制文件)构建了第三方,并将它们的二进制文件/头文件放在我基线的第三方文件夹中。无需安装。
标签: c++ cmake include-path