将简单的 makefile 转换为 CMakeLists.txt?

Posted

技术标签:

【中文标题】将简单的 makefile 转换为 CMakeLists.txt?【英文标题】:Converting simple makefile into CMakeLists.txt? 【发布时间】:2019-08-12 01:36:46 【问题描述】:

我正在尝试将这个简单的 makefile 转换为 CMakeLists.txt。我特别为这些标志而苦苦挣扎。

SOURCE = triangle.cpp shader.cpp
CC = g++
CFLAGS = -Wall -Wextra -pedantic -framework OpenGL -framework GLUT -lGLEW -lglfw
OBJECT = window

default:
    $(CC) -o $(OBJECT) $(SOURCE) $(CFLAGS)

clean:
    rm -f $(OBJECT)

这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project(Graphics)

set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic -framework OpenGL -framework GLUT -lGLEW -lglfw")

#add_definitions($CMAKE_CXX_FLAGS)

add_executable(
    trtangle
    triangle.cpp
)

这是我收到的错误消息:

Scanning dependencies of target triangle
[ 50%] Building CXX object CMakeFiles/triangle.dir/triangle.cpp.o
clang: warning: -framework OpenGL: 'linker' input unused [-Wunused command-line-argument]
clang: warning: -framework GLUT: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lGLEW: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lglfw: 'linker' input unused [-Wunused-command-line-argument]
/Users/neilculbertson/Desktop/OpenGL/triangle.cpp:2:10: fatal error: 'GL/glew.h' file not found
#include <GL/glew.h>
          ^~~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/triangle.dir/triangle.cpp.o] Error 1
make[1]: *** [CMakeFiles/triangle.dir/all] Error 2
make: *** [all] Error 2

我也尝试过设置 CMAKE_C_FLAGS 但仍然没有运气。请记住,当我单独使用 makefile 时,一切都可以编译并完美运行。我想知道这是否是一个GL错误?还是我奇怪地安装了 GLEW?

【问题讨论】:

【参考方案1】:

cmake

cmake_minimum_required(VERSION 3.0)       # This line is required
project(triangle)                         # This line is required

制作

CC = g++
CFLAGS = -Wall -Wextra -pedantic -framework OpenGL -framework GLUT -lGLEW -lglfw

cmake

set(CMAKE_CXX_FLAGS  "-Wall -Wextra -pedantic -framework OpenGL -framework GLUT -lGLEW -lglfw")

制作

SOURCE = triangle.cpp shader.cpp
default:
    $(CC) -o $(OBJECT) $(SOURCE) $(CFLAGS)

cmake

# The name of the result and all required sources
add_executable(triangle triangle.cpp shader.cpp)

# These libraries are required
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glfw3 3.0 REQUIRED)

# ... and the path to the header files and so files 
target_include_directories(triangle  $OPENGL_INCLUDE_DIRS  $GLEW_INCLUDE_DIRS)
target_link_libraries(triangle $OPENGL_LIBRARIES $GLEW_LIBRARIES glfw3)

其他可能性是首先收集列表中的所有来源。

set(SOURCES triangle.cpp shader.cpp)
add_executable(triangle $SOURCES)

制作

OBJECT = window

cmake

没有必要

制作

clean:
    rm -f $(OBJECT)

cmake

这是内置的。

【讨论】:

这行不通。您需要先创建目标,然后应用target_include_directoriestarget_link_libraries 命令。 我会重做的。但这使得将其与 make 文件进行比较变得更加困难。 而不是设置CMAKE_CXX_FLAGS,CMake 更喜欢你使用add_compile_options()(和add_compile_definitions(),如果你需要的话)。 ...而target_compile_options() 也可用于为目标设置它们。【参考方案2】:
cmake_minimum_required(VERSION 3.0)
project(Graphics)

add_executable(
    trtangle
    triangle.cpp
)

target_compile_options(trtangle PRIVATE -Wall -Wextra -pedantic)

find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glfw3 3.3 REQUIRED)

target_include_directories(trtangle  $OPENGL_INCLUDE_DIRS  $GLEW_INCLUDE_DIRS)
target_link_libraries(trtangle $OPENGL_LIBRARIES $GLEW_LIBRARIES glfw)

【讨论】:

不起作用。起初,CMake 抱怨 target_include_directories 的参数数量,所以我把 PUBLIC 放在那里: target_include_directories(triangle PUBLIC $OPENGL_INCLUDE_DIRS $GLEW_INCLUDE_DIRS) 但我仍然收到同样的错误,说它找不到 顺便说一句,感谢您的帮助!!

以上是关于将简单的 makefile 转换为 CMakeLists.txt?的主要内容,如果未能解决你的问题,请参考以下文章

将makefile转换为其相关的makefile [关闭]

将 Makefile 转换为 CMakeLists.txt

将具有循环链接依赖的makefile转换为CMake

c++ makefile 编译出错,无法转换 main()::

Makefile之清晰认知

Qt之QMake编译转换为CMake编译