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. :sweat:

  • 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.
1 Like

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

2 Likes

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

-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.

2 Likes

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

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

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

1 Like

Đâ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;
}

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

1 Like

Vẫn lỗi ạ

DSO missing from command line

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?

1 Like

Nó báo ở lglfw3 ạ :((

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

1 Like

learnopengl.com ạ.

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 =)

1 Like

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

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

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?