30/09/2018, 19:45

Lỗi "bash ./filename permisson denied" khi run chương trình OpenGL

Em có viết một chương trình OpenGL khá đơn giản và build nó trên linux bằng command line

g++ --std=c++11 -c  filename.cpp -lGLEW -lglfw3 -lGL -lGLU -exll -lpthread -exrand -exi -o filename

thì chương trình tạo ra một file là “filename”, đáng lý ra nó phải là file exec nhưng lại không phải, và khi em gõ lệnh

./filename

thì chương trình thông báo lỗi

bash ./filename permisson denied

Cho em hỏi cách fix lỗi này ạ. Đã google search nhưng không fix được.

Toan Tran viết 21:57 ngày 30/09/2018
  • Thử chmod u+x filename
    hoặc
  • sudo g++ --std=c++11 -c filename.cpp -lGLEW -lglfw3 -lGL -lGLU -exll -lpthread -exrand -exi -o filename
    nếu không đuợc thì mình chịu.
viết 21:51 ngày 30/09/2018

-c

có flag -c thì nó chỉ compile ra object file thôi chứ đâu có link thành executable

Toan Tran viết 21:53 ngày 30/09/2018

cuối cùng vẫn -o mà bạn. filename tạo thành là file exec

viết 21:56 ngày 30/09/2018

-o chỉ là để đặt tên cho cái file output thôi. Nó đâu có link mấy cái như glew glfw3 gl glu hay pthread gì vô thành file thực thi đâu

ví dụ:
g++ -c main.cpp -o main.o
g++ -c test.cpp -o test.o

thì main.o hay test.o đâu phải là file thực thi. Cái .o có hay ko thì file output vẫn chỉ là object file. Hiểu nó như là 1 chapter của 1 cuốn truyện vậy. -c chỉ dịch chapter đó, ví dụ từ tiếng Nhật sang tiếng Anh thôi. Còn link với mấy chapter khác nữa thì mới thành 1 cuốn truyện hoàn chỉnh:
g++ main.o test.o -o main.exe

hoặc có thể viết gộp compile và link:
g++ main.cpp test.cpp -o main.exe
nhưng viết như vậy thì mỗi lần sửa 1 file, thì phải biên dịch tất cả các file khác lại từ đầu. Dịch từng file riêng biệt thì tránh được vấn đề này. Sửa chapter nào thì dịch lại chapter đó thôi, rồi sau đó link các chapter đã dịch lại.

Toan Tran viết 22:01 ngày 30/09/2018

vậy là do mình hiểu sai rồi, đọc thêm sách đã

Phạm Văn Hoàng viết 21:48 ngày 30/09/2018

Nhưng nếu không có flag -c lại báo lỗi DSO missing ạ.

viết 21:49 ngày 30/09/2018

bạn copy nội dung của cả file bạn compile đi

Phạm Văn Hoàng viết 21:52 ngày 30/09/2018

Đây ạ.

#define GLEW_STATIC // using the static version of the GLEW library
#include "GL/glew.h"
#include "GLFW/glfw3.h"
#include "GL/glu.h"
#include "GL/glut.h"

#include <iostream>
#include <fstream>
#include <algorithm>

int main(int argc, char const *argv[])
{
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
	GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
	if (window == NULL) {

		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}	
	glfwMakeContextCurrent(window);
	glewExperimental = GL_TRUE;
	if (glewInit() != GLEW_OK)
	{
		std::cout << "Failed to initialize GLEW" << std::endl;
		return -1;
	}

	glViewport(0,0, 800, 600);
	// Game loop

	while (!glfwWindowShouldClose(window)) {

		glfwPollEvents();
		glfwSwapBuffers(window);
	}
	glfwTerminate();
	return 0;
}
viết 21:56 ngày 30/09/2018

vậy thử compile trước rồi link sau:

g++ -c filename.cpp -o filename.o

g++ filename.o -lGLEW -lglfw3 -lGL -lGLU -exll -lpthread -exrand -exi -o filename

Phạm Văn Hoàng viết 21:47 ngày 30/09/2018

Vẫn lỗi ạ

DSO missing from command line
viết 21:50 ngày 30/09/2018

vậy thì chắc thứ tự link phải đúng
-lGLEW -lglfw3 -lGL -lGLU -exll -lpthread -exrand -exi
thú tự 8 thư viện này ko đúng quá. Nó báo lỗi ở lib nào?

Phạm Văn Hoàng viết 22:01 ngày 30/09/2018

Nó báo ở lglfw3 ạ :((

viết 22:00 ngày 30/09/2018

chắc ta cũng bó tay quá =) Tutorial ở trang nào vậy

Phạm Văn Hoàng viết 21:47 ngày 30/09/2018

Ở learnopengl.com ạ.

viết 22:01 ngày 30/09/2018

thử link với dòng lệnh này thử xem =)

g++ filename.o -o filename -lGLEW -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor

link được nhưng ta chạy trên virtual box ko được =)

Phạm Văn Hoàng viết 21:48 ngày 30/09/2018

Vi diệu quá. Nó chụp màn hình rồi show lên window luôn.

viết 21:57 ngày 30/09/2018

chạy được rồi hả Chớp cái rồi tắt phải ko?

Phạm Văn Hoàng viết 21:48 ngày 30/09/2018

Ko chớp ạ. Dùng double buffer mà anh.

Bài liên quan
0