我找到了一个关于如何使用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)
对不起长代码....谢谢!
答案 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_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}
指定了这些库的完整路径,那么我认为你应该好好去。