我曾经使用Windows使用Visual Studio制作OpenGL项目,设置依赖关系相对容易,现在我在Ubuntu 20. 4中尝试一些东西,并使用Cmake来构建,存在构建错误。
我的项目结构-
--------path to project dir|
|---external_dep|
| |----include|
| | |----glad|
| | | |---related headers
| | |
| | |----GLFW|
| | | |---related headers
| | |----KHR|
| | | |----related headers
| | |
| | |----GLM|
| | |----related headers
| |
| |----lib|
| | |------libglfw3.a
| |
|----resources|
| |----vertex.glsl
| |----fragment.glsl
|
|----src|
| |----main.cpp
| |----shaderclass.h
| |----shaderclass.cpp
| |----glad.c
|
|----CMakeLists.txt
现在我找到了几个教程,但是他们使用ubuntu apt包和一个简单的命令find_package()
来完成这项工作,但是我想沿着所有的依赖项来构建我的程序。
我的CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(triangle)
set(CMAKE_BUILD_TYPE "Release")
find_package(OpenGL REQUIRED)
include_directories(${CMAKE_SOURCE_DIR}/external_dep/include)
link_directories(${CMAKE_SOURCE_DIR}/external_dep/lib)
add_executable(triangle src/main.cpp src/glad.c src/shaderCreation.h src/shaderCreation.cpp)
target_link_libraries(triangle PUBLIC glfw3 ${CMAKE_DL_LIBS} m OpenGL::GL X11)
这给出了错误。
[build] /usr/bin/ld: /home/alvi95/Personal/code/TutOpenGL/2.triangle/example1/external_dep/lib/libglfw3.a(posix_thread.c.o): in function `_glfwPlatformCreateTls':
[build] posix_thread.c:(.text+0x4a): undefined reference to `pthread_key_create'
[build] /usr/bin/ld: /home/alvi95/Personal/code/TutOpenGL/2.triangle/example1/external_dep/lib/libglfw3.a(posix_thread.c.o): in function `_glfwPlatformDestroyTls':
[build] posix_thread.c:(.text+0xa4): undefined reference to `pthread_key_delete'
[build] /usr/bin/ld: /home/alvi95/Personal/code/TutOpenGL/2.triangle/example1/external_dep/lib/libglfw3.a(posix_thread.c.o): in function `_glfwPlatformGetTls':
[build] posix_thread.c:(.text+0x105): undefined reference to `pthread_getspecific'
[build] /usr/bin/ld: /home/alvi95/Personal/code/TutOpenGL/2.triangle/example1/external_dep/lib/libglfw3.a(posix_thread.c.o): in function `_glfwPlatformSetTls':
[build] posix_thread.c:(.text+0x15a): undefined reference to `pthread_setspecific'
[build] collect2: error: ld returned 1 exit status
[build] ninja: build stopped: subcommand failed.
[proc] The command: /usr/local/bin/cmake --build /home/alvi95/Personal/code/TutOpenGL/2.triangle/example1/build --config Release --target all -- exited with code: 1
[build] Build finished with exit code 1
如何正确的编写cmake文件?如何在构建过程中链接着色器文件?
2条答案
按热度按时间wgmfuz8q1#
我已经找到了让程序编译和运行的方法,我不是程序员,而是一个想要可视化物理模拟的机械工程师。
文件结构与上面给出的相同。
我的main.cpp
shaderClass.h
shaderClass.cpp
hc2pp10m2#
编写CMakeLists.txt文件取决于具体的项目和构建需求,但这里有一些通用指南:
使用cmake_minimum_required()在文件顶部设置所需的CMake最低版本。
使用project()创建项目名称。
使用set()和add_compile_options()设置任何必要的项目范围的选项或设置,例如构建类型、C++标准、编译器标志等。
使用add_subdirectory()添加包含其他CMakeLists.txt文件的任何子目录。
使用find_package()包含项目所需的任何外部库,或使用link_directories()手动链接到它们的位置。
要构建可执行目标,请使用add_executable()并列出必要的源文件。
要构建库目标,请使用add_library()并列出必要的源文件。
使用target_link_libraries()将所有必要的库链接到目标。
对于在构建过程中链接着色器文件,您可以使用configure_file()或add_custom_command()根据需要复制或预处理它们。然后像链接任何其他源文件一样链接处理后的文件。
下面是一个构建可执行目标的示例CMakeLists.txt:
项目(MyProject)
设置(CMAKE_CXX_标准11)
add_executable(MyExecutable main.cpp shader.vert shader.frag)
链接GLFW和GLEW库
查找程序包(需要GLFW)查找程序包(需要GLEW)目标链接库(我的可执行文件GLFW::GLFW GLEW::GLEW)
在本例中,set()命令用于将C++标准设置为11。add_executable()命令创建MyExecutable目标,并指定它由main.cpp、shader.vert和shader.frag源文件组成。find_package()命令用于定位GLFW和GLEW库,target_link_libraries()用于将它们链接到可执行目标。