【问题标题】:CMake, Qt and CMAKE_INCLUDE_PATHCMake、Qt 和 CMAKE_INCLUDE_PATH
【发布时间】:2012-05-13 11:14:23
【问题描述】:

我找到了关于如何使用 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)

抱歉,代码太长了……谢谢!

【问题讨论】:

  • 为什么在没有解释的情况下投反对票?没有帮助。

标签: qt cmake


【解决方案1】:

这里有几个问题。

我不确定这是否只是一个错字,但你不能只是将设置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_path 和 find_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} 指定了这些库的完整路径,那么我认为你应该很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多