2

我找到了一个很好的答案,关于如何使用 CMake 在 Qt 中找到可执行文件,cmake not find 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)

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

4

1 回答 1

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})(请参阅FindQt4 的文档),因此您在此处添加了两次。我不熟悉 Coin3 或 Quarter,但它们实际上可能不会生成任何必需的预处理器定义。您可以通过添加以下内容来检查它们的内容:

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

暂时(在相应的find_package调用之后)。如果这些是空的,您可以删除add_definitions呼叫。


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

于 2012-05-13T12:44:15.163 回答