我正在尝试使用CMake构建一个非常简单的“ hello三角形” OpenGL应用程序。我想使用find_package(GLEW)和生成的导入目标与Glew链接。运行make命令时,出现“没有规则可用于目标”错误。
根据CMake文档
https://cmake.org/cmake/help/latest/module/FindGLEW.html
https://cmake.org/cmake/help/latest/command/find_package.html
我可以使用find_package(GLEW)返回目标GLEW :: GLEW,我可以使用该目标将Glew库链接到我的代码。当我运行cmake ..
时,所有内容都会生成,并且报告已找到glew-config.cmake文件。
-- Found GLEW: /usr/local/lib/cmake/glew/glew-config.cmake
然后我运行make
并收到此错误
$ make
Scanning dependencies of target test
[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.o
make[2]: *** No rule to make target `/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenGL.framework', needed by `test'. Stop.'
我正在运行Mojave 10.14,并使用自制软件安装了最新的cmake和glew。上面的错误中返回的路径不存在,我也不知道它来自哪里。
这是我的CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)
project(test)
find_package(GLEW REQUIRED)
add_executable(test main.cpp)
target_link_libraries(test GLEW::GLEW)
这是我的源代码:
#include <GL/glew.h>
#include <iostream>
int main(int argc, char **argv){
std::cout << "Glew Test" << std::endl;
}
如您所见,这是简单链接Glew所需的最少代码。
问题似乎类似于以下问题:
CMake FIND_PACKAGE succeeds but returns wrong path
但是,在那种情况下,有一种使用特定于Boost的命令行标志的解决方案。我发现的有关FindGLEW和macOS问题的唯一参考资料是:
https://gitlab.kitware.com/cmake/cmake/issues/19542
但这似乎已解决。
我遇到的问题似乎是FindGLEW.cmake返回的路径:
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenGL.framework
我已经查看了实际的FindGLEW.cmake文件,以查看是否可以找到此路径的源,但是我不是CMake的专家,所以很快就迷路了。我如何找到这条路径的起源?与上面的Boost问题类似,是否可以设置任何CMake标志或变量来解决此问题?
我已使用此CMakeLists.txt与Glew成功链接:
cmake_minimum_required(VERSION 3.15)
project(test)
find_library(GLEW_DYLIB GLEW "/usr/local/Cellar/glew/2.1.0/lib")
if(NOT GLEW_DYLIB)
message(FATAL_ERROR "Glew not found")
endif()
add_library(Glew_target SHARED IMPORTED)
set_property(TARGET Glew_target PROPERTY IMPORTED_LOCATION "/usr/local/Cellar/glew/2.1.0/lib/libGLEW.dylib")
set_property(TARGET Glew_target PROPERTY IMPORTED_IMPLIB ${GLEW_DYLIB})
include_directories(
"/usr/local/Cellar/glew/2.1.0/include/"
)
add_executable(test main.cpp)
target_link_libraries(test Glew_target)
但是,我宁愿使用find_package()
使事情尽可能简单,因为这绝对是一种更清洁的方法。
编辑:已解决-请参阅下面的Tsyvarev注释,以澄清CMake在上面发现的glew-config文件的性质。我删除了此文件,并没有任何问题地重建了项目。