CMake,Qt和CMAKE_INCLUDE_PATH

时间:2012-05-13 11:14:23

标签: qt cmake

我找到了一个关于如何使用CMake查找Qt中的可执行文件的一个很好的答案,cmake not finding Qt4

你如何使用CMAKE_INCLUDE_PATH?我试了一下,但是我收到了一个错误:

    cmake_minimum_required(VERSION 2.8)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/../cmake_modules)

project(vrvu)

find_package(OpenGL REQUIRED)(CMAKE_INCLUDE_PATH <--- this is where I'm getting an error
 C:\QtSDK\Desktop\Qt\4.8.0\msvc2010\bin)find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED)
include(${QT_USE_FILE})
find_package(Coin3 REQUIRED)
find_package(Quarter REQUIRED)

add_subdirectory(bullet-2.77)
add_subdirectory(starlight)

file(GLOB SOURCES "*.cpp" "*.cxx" "*.h" "*.hpp")

include_directories(${OPENGL_INCLUDE_DIR} ${QT_INCLUDE_DIR} ${COIN_INCLUDE_DIR} ${QUARTER_INCLUDE_DIR} "./bullet-2.77/src" "./starlight")
link_directories(${QT_LIB_DIR} ${COIN_LINK_DIRECTORIES} ${QUARTER_LINK_DIRECTORIES})

add_definitions(${QT_DEFINITIONS} ${COIN_DEFINITIONS} ${QUARTER_DEFINITIONS})

add_executable(vrvu ${SOURCES})
target_link_libraries(vrvu ${OPENGL_LIBRARIES} ${QT_LIBRARIES} ${COIN_LIBRARIES} ${QUARTER_LIBRARIES} LinearMath BulletCollision starlight)

对不起长代码....谢谢!

1 个答案:

答案 0 :(得分:4)

这里有几个问题。

我不确定这只是一个错字,但你不能只是附加指令将CMAKE_INCLUDE_PATH设置到find_package命令的末尾,你需要一个单独的set命令:

find_package(OpenGL REQUIRED)
set(CMAKE_INCLUDE_PATH "C:\\QtSDK\\Desktop\\Qt\\4.8.0\\msvc2010\\bin")
find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED)

请注意,如果您使用反斜杠,则指定的路径需要转义分隔符。或者,您可以使用单个正斜杠代替双反斜杠,即使在Windows上也是如此。在这种情况下,将路径放在引号中没有任何效果,但如果路径包含空格,这是一个很好的习惯。


设置CMAKE_INCLUDE_PATH扩展了CMake仅在执行find_pathfind_file调用时尝试的路径列表。这对于find_package调用很有用,但在这种情况下更可能是设置CMAKE_PREFIX_PATH,它扩展了所有find_XXX命令的搜索路径。它确实意味着您需要从路径中删除“\ bin”,因为它在搜索可执行文件时附加到CMAKE_PREFIX_PATH

set(CMAKE_PREFIX_PATH "C:\\QtSDK\\Desktop\\Qt\\4.8.0\\msvc2010")


接下来,file(GLOB SOURCES "*.cpp" "*.cxx" "*.h" "*.hpp")。虽然这实际上不是一个错误,但通常不赞成使用这种技术来创建源文件列表,因为如果将文件添加或删除到源树,CMake将没有“知识”并且不会重新跑。建议的方法是手动将每个源文件添加到CMakeLists.txt,以便添加或删除将自动导致CMake重新运行。

此外,“SOURCES”是变量名称的不良选择,因为它也代表了CMake目标的属性。


另一个不受欢迎的做法是使用link_directories。文档说明了为什么通常不需要它,这应该就是这种情况。


add_definitions行也可能是不必要的。 Qt确实定义了定义,但是当你include(${QT_USE_FILE})(参见the documentation for FindQt4)时已经添加了它们,所以你在这里添加它们两次。我不熟悉Coin3或Quarter,但它们实际上可能不会生成任何所需的预处理器定义。您可以通过添加以下内容来检查其内容:

message("COIN_DEFINITIONS: ${COIN_DEFINITIONS}")
message("QUARTER_DEFINITIONS: ${QUARTER_DEFINITIONS}")

暂时(在相应的find_package电话后)。如果这些为空,则可以删除add_definitions来电。


假设变量${COIN_LIBRARIES}${QUARTER_LIBRARIES}指定了这些库的完整路径,那么我认为你应该好好去。