在 Linux 上动态和静态地使用 C++ 库
Using C++ libraries on Linux dynamically and statically
如果这是一个重复的问题,我深表歉意,但我无法在任何地方找到答案。
我是 C++ 新手,希望开始学习 OpenGL。为此,我需要同时设置 GLEW and GLFW。尽管阅读了文档并进行了大量研究,但我无法弄清楚如何静态和动态地利用 C++ 库。我找不到答案的主要原因是我在 Ubuntu 上 运行,而大多数资源用于 Windows.
我尝试按照文档使用 CMake 构建库。我似乎成功地构建了这些库,但是当将这些库与编译器一起使用时,问题就来了,我再次找不到足够好的答案。
我尝试了以下步骤来安装 GLEW 和 GLFW:
- 从 here 安装 GLEW。
- 从 here 安装 GLFW。
- 解压缩 GLEW 和 GLFW
- 进入 GLEW 文件夹
- 运行
make
、sudo make install
和 make clean
(在 this 之后)
- 进入 GLFW 文件夹
- 运行
mkdir build
、cd build
和 cmake ..
(在 this 之后)
这就是它变得棘手的地方。
- 运行
mkdir test-project
, mkdir test-project/dependencies
, mkdir test-project/dependencies/include
, mkdir test-project/dependencies/lib
- 将GLFW包含目录中的
GLFW
文件夹移动到项目包含目录
我不知道我应该做什么 link,所以我跳过了这部分。
- 将GLEW包含目录中的
GL
文件夹移动到项目包含目录
- 将
lib
文件夹的内容移动到项目lib
目录
- 在项目文件夹中创建一个
main.cpp
文件
- 将此添加到
main.cpp
:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main()
{
return 0;
}
- 转到项目文件夹并执行
g++ ./main.cpp -I ./dependencies/include -L ./dependencies/lib
然后我收到此错误:
In file included from ./main.cpp:1:
./dependencies/include/GL/glew.h:1205:14: fatal error: GL/glu.h: No such file or directory
1205 | # include <GL/glu.h>
| ^~~~~~~~~~
compilation terminated.
请有人解释一下 C++ 库如何动态和静态工作,如何动态和静态安装库,并提供一些在 Ubuntu.
上使用 GLEW 和 GLFW 的步骤
如有任何帮助,我们将不胜感激!
由于您正在使用 Ubuntu,您可以使用 apt 安装这些库。
sudo apt install libglfw3-dev
sudo apt install libglew-dev
sudo apt install libgl1-mesa-dev
完成这些之后,您应该在系统上安装了 GLEW 和 GLFW。为了构建我会使用 CMake。只需具有以下文件夹结构:
├── build
├── CMakeLists.txt
└── main.cpp
其中 CMakeLists.txt
是:
cmake_minimum_required(VERSION 3.17)
project(test LANGUAGES CXX)
add_executable(test main.cpp)
target_link_libraries(test glfw GLEW /usr/lib/x86_64-linux-gnu/libGL.so.1)
和main.cpp
是:
#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main()
{
if (!glfwInit()) {
fprintf(stderr, "ERROR: could not start GLFW3\n");
return 1;
}
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello Triangle", NULL, NULL);
if (!window) {
fprintf(stderr, "ERROR: could not open window with GLFW3\n");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
const GLubyte* version = glGetString(GL_VERSION); // version as a string
printf("Renderer: %s\n", renderer);
printf("OpenGL version supported %s\n", version);
glEnable(GL_DEPTH_TEST); // enable depth-testing
glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
glfwTerminate();
return 0;
}
为了构建这个应用程序
cd build
cmake ..
make
./test
P.S:示例代码取自此处:https://antongerdelan.net/opengl/hellotriangle.html
更新:
CMake 搜索库的默认路径。在 Unix 系统中,它们是 /usr/local/lib, /usr/lib/x86_64-linux-gnu/, /usr/lib
等。包含目录也是如此:/usr/include
、/usr/include/x86_64-linux-gnu/
和 /usr/local/include
这些是通过包管理器安装的库使用的路径。
如果您想包含来自不同路径的库。让我们做一个简单的例子:
我编写了一个库并将其发布为:
.
├── CMakeLists.txt
├── untitled.cpp
└── untitled.h
其中 untitled.h:
#pragma once
class MyLibrary
{
public:
MyLibrary();
void doWork();
};
和untitled.cpp:
#include <untitled.h>
#include<iostream>
MyLibrary::MyLibrary()
{
}
void MyLibrary::doWork()
{
std::cout<<"do work is called"<<std::endl;
}
和我的 CMakeLists.txt :
cmake_minimum_required(VERSION 3.14)
project(untitled LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_library(untitled SHARED
untitled.h
untitled.cpp
) # I am generating shared library from these source files.
# Then I am telling cmake to generate Makefile so that when user does make install
# my library will be installed to folder /usr/local/untitled/
set_target_properties(untitled PROPERTIES PUBLIC_HEADER "untitled.h")
INSTALL(TARGETS untitled
LIBRARY DESTINATION untitled/lib
PUBLIC_HEADER DESTINATION untitled/include)
现在,作为我的图书馆的用户,您下载了源代码并希望为您的系统构建。你关注
mkdir build && cd build && cmake .. && make
那你运行sudo make install
。输出类似于:
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/untitled/lib/libuntitled.so
-- Installing: /usr/local/untitled/include/untitled.h
那么你想在你的项目中使用这个库。
cmake_minimum_required(VERSION 3.17)
project(test LANGUAGES CXX)
add_executable(test main.cpp)
# You should add these lines to your CMake file because now my library lives in an unusual path
target_include_directories(test PUBLIC /usr/local/untitled/include)
target_link_directories(test PUBLIC /usr/local/untitled/lib)
# And I have updated link_libraries section with X because there is an libX.so file
# under any of these library paths: /usr/local/lib, /usr/lib (default paths) and custom
# added library path : (usr/local/untitled/lib). In this case X is untitled.
target_link_libraries(test glfw GLEW /usr/lib/x86_64-linux-gnu/libGL.so.1 untitled)
我正在使用库 :
#include <untitled.h>
int main()
{
MyLibrary ml;
ml.doWork();
return 0;
}
要查看系统中包含目录的位置,请参阅此 answer
要查看系统中的库在哪里,请参阅此 answer
如果这是一个重复的问题,我深表歉意,但我无法在任何地方找到答案。
我是 C++ 新手,希望开始学习 OpenGL。为此,我需要同时设置 GLEW and GLFW。尽管阅读了文档并进行了大量研究,但我无法弄清楚如何静态和动态地利用 C++ 库。我找不到答案的主要原因是我在 Ubuntu 上 运行,而大多数资源用于 Windows.
我尝试按照文档使用 CMake 构建库。我似乎成功地构建了这些库,但是当将这些库与编译器一起使用时,问题就来了,我再次找不到足够好的答案。
我尝试了以下步骤来安装 GLEW 和 GLFW:
- 从 here 安装 GLEW。
- 从 here 安装 GLFW。
- 解压缩 GLEW 和 GLFW
- 进入 GLEW 文件夹
- 运行
make
、sudo make install
和make clean
(在 this 之后) - 进入 GLFW 文件夹
- 运行
mkdir build
、cd build
和cmake ..
(在 this 之后)
这就是它变得棘手的地方。 - 运行
mkdir test-project
,mkdir test-project/dependencies
,mkdir test-project/dependencies/include
, mkdirtest-project/dependencies/lib
- 将GLFW包含目录中的
GLFW
文件夹移动到项目包含目录
我不知道我应该做什么 link,所以我跳过了这部分。 - 将GLEW包含目录中的
GL
文件夹移动到项目包含目录 - 将
lib
文件夹的内容移动到项目lib
目录 - 在项目文件夹中创建一个
main.cpp
文件 - 将此添加到
main.cpp
:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main()
{
return 0;
}
- 转到项目文件夹并执行
g++ ./main.cpp -I ./dependencies/include -L ./dependencies/lib
然后我收到此错误:
In file included from ./main.cpp:1:
./dependencies/include/GL/glew.h:1205:14: fatal error: GL/glu.h: No such file or directory
1205 | # include <GL/glu.h>
| ^~~~~~~~~~
compilation terminated.
请有人解释一下 C++ 库如何动态和静态工作,如何动态和静态安装库,并提供一些在 Ubuntu.
上使用 GLEW 和 GLFW 的步骤如有任何帮助,我们将不胜感激!
由于您正在使用 Ubuntu,您可以使用 apt 安装这些库。
sudo apt install libglfw3-dev
sudo apt install libglew-dev
sudo apt install libgl1-mesa-dev
完成这些之后,您应该在系统上安装了 GLEW 和 GLFW。为了构建我会使用 CMake。只需具有以下文件夹结构:
├── build
├── CMakeLists.txt
└── main.cpp
其中 CMakeLists.txt
是:
cmake_minimum_required(VERSION 3.17)
project(test LANGUAGES CXX)
add_executable(test main.cpp)
target_link_libraries(test glfw GLEW /usr/lib/x86_64-linux-gnu/libGL.so.1)
和main.cpp
是:
#include <stdio.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main()
{
if (!glfwInit()) {
fprintf(stderr, "ERROR: could not start GLFW3\n");
return 1;
}
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello Triangle", NULL, NULL);
if (!window) {
fprintf(stderr, "ERROR: could not open window with GLFW3\n");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
const GLubyte* version = glGetString(GL_VERSION); // version as a string
printf("Renderer: %s\n", renderer);
printf("OpenGL version supported %s\n", version);
glEnable(GL_DEPTH_TEST); // enable depth-testing
glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
glfwTerminate();
return 0;
}
为了构建这个应用程序
cd build
cmake ..
make
./test
P.S:示例代码取自此处:https://antongerdelan.net/opengl/hellotriangle.html
更新:
CMake 搜索库的默认路径。在 Unix 系统中,它们是 /usr/local/lib, /usr/lib/x86_64-linux-gnu/, /usr/lib
等。包含目录也是如此:/usr/include
、/usr/include/x86_64-linux-gnu/
和 /usr/local/include
这些是通过包管理器安装的库使用的路径。
如果您想包含来自不同路径的库。让我们做一个简单的例子:
我编写了一个库并将其发布为:
.
├── CMakeLists.txt
├── untitled.cpp
└── untitled.h
其中 untitled.h:
#pragma once
class MyLibrary
{
public:
MyLibrary();
void doWork();
};
和untitled.cpp:
#include <untitled.h>
#include<iostream>
MyLibrary::MyLibrary()
{
}
void MyLibrary::doWork()
{
std::cout<<"do work is called"<<std::endl;
}
和我的 CMakeLists.txt :
cmake_minimum_required(VERSION 3.14)
project(untitled LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_library(untitled SHARED
untitled.h
untitled.cpp
) # I am generating shared library from these source files.
# Then I am telling cmake to generate Makefile so that when user does make install
# my library will be installed to folder /usr/local/untitled/
set_target_properties(untitled PROPERTIES PUBLIC_HEADER "untitled.h")
INSTALL(TARGETS untitled
LIBRARY DESTINATION untitled/lib
PUBLIC_HEADER DESTINATION untitled/include)
现在,作为我的图书馆的用户,您下载了源代码并希望为您的系统构建。你关注
mkdir build && cd build && cmake .. && make
那你运行sudo make install
。输出类似于:
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/untitled/lib/libuntitled.so
-- Installing: /usr/local/untitled/include/untitled.h
那么你想在你的项目中使用这个库。
cmake_minimum_required(VERSION 3.17)
project(test LANGUAGES CXX)
add_executable(test main.cpp)
# You should add these lines to your CMake file because now my library lives in an unusual path
target_include_directories(test PUBLIC /usr/local/untitled/include)
target_link_directories(test PUBLIC /usr/local/untitled/lib)
# And I have updated link_libraries section with X because there is an libX.so file
# under any of these library paths: /usr/local/lib, /usr/lib (default paths) and custom
# added library path : (usr/local/untitled/lib). In this case X is untitled.
target_link_libraries(test glfw GLEW /usr/lib/x86_64-linux-gnu/libGL.so.1 untitled)
我正在使用库 :
#include <untitled.h>
int main()
{
MyLibrary ml;
ml.doWork();
return 0;
}
要查看系统中包含目录的位置,请参阅此 answer 要查看系统中的库在哪里,请参阅此 answer