将 SDL2 库与 pkg-config 链接

2024-02-21

我使用的是 Ubuntu 14.04LTS。我已经通过从源代码编译安装了 SDL2 库(方法 1https://askubuntu.com/questions/344512/what-is-the-general-procedure-to-install-development-libraries-in-ubuntu https://askubuntu.com/questions/344512/what-is-the-general-procedure-to-install-development-libraries-in-ubuntu)并使用 sudo apt-get install libsdl2-dev。 据我了解,前者将库和头文件安装在 /usr/local/(lib 和 include)中,而后者将它们安装在 /usr/(lib 和 include)中的系统范围内。

当我尝试编译一个简单的代码来测试功能时:

#include <SDL.h>
#include <stdio.h>

int main(int argc, char* argv[]) {SDL_Window *window;                       
// Declare a pointer

SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2

// Create an application window with the following settings:
window = SDL_CreateWindow(
    "An SDL2 window",                  // window title
    SDL_WINDOWPOS_UNDEFINED,           // initial x position
    SDL_WINDOWPOS_UNDEFINED,           // initial y position
    640,                               // width, in pixels
    480,                               // height, in pixels
    SDL_WINDOW_OPENGL                  // flags - see below
);

// Check that the window was successfully created
if (window == NULL) {
    // In the case that the window could not be made...
    printf("Could not create window: %s\n", SDL_GetError());
    return 1;
}

// The window is open: could enter program loop here (see SDL_PollEvent())

SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example

// Close and destroy the window
SDL_DestroyWindow(window);

// Clean up
SDL_Quit();
return 0;

using: g++ sdl_test.cpp -o sdlout

编译器输出:

sdltest.cpp:2:17: fatal error: SDL.h: No such file or directory
#include <SDL.h>
                ^
compilation terminated.

如果我改为#include <SDL2/SDL.h>我收到以下错误:

/tmp/cc05JSKn.o: In function `main':
sdltest.cpp:(.text+0x15): undefined reference to `SDL_Init'
sdltest.cpp:(.text+0x3a): undefined reference to `SDL_CreateWindow'
sdltest.cpp:(.text+0x4a): undefined reference to `SDL_GetError'
sdltest.cpp:(.text+0x6d): undefined reference to `SDL_Delay'
sdltest.cpp:(.text+0x79): undefined reference to `SDL_DestroyWindow'
sdltest.cpp:(.text+0x7e): undefined reference to `SDL_Quit'
collect2: error: ld returned 1 exit status

这是基本功能,所以我假设共享对象库没有正确链接。

我也尝试过:g++ -Wall sdltest.cpp -o outsdl -I /usr/local/include -L /usr/local/lib 指定路径,但我再次得到:

sdltest.cpp:2:17: fatal error: SDL.h: No such file or directory
#include <SDL.h>
                ^
compilation terminated.

唯一有效并成功编译的命令是使用 pkg-config 时g++ sdltest.cpp -o outsdl $(pkg-config --cflags --libs sdl2)

因此,我有以下问题:

1) 为什么需要 pkg-config 以及编译和链接标志如何工作?

2)是否可以做一些其他事情以使编译命令更简单?

3)(如果之前没有解释)pkg-config 和使用不起作用的 -I 和 -L 之间有什么区别?

4) $(...) 在命令行中实际上做了什么,它与 `...` 完全相同吗?

谢谢。


The pkg-config命令或多或少是一种跨平台或跨发行版的方式,为编译器提供正确的标志,以允许它查找头文件和库文件。这样,您的系统可以将文件存储在不同的位置,并且每个人都可以使用相同的命令来编译您的代码。它还有助于解决您尝试使用的库的任何特殊要求。

Using $()与使用反引号相同,因此您可以执行括号内的内容,以查看哪些额外参数被传递给编译器以使其工作。这是我运行时在机器上得到的结果pkg-config --cflags --libs sdl2:

-D_REENTRANT -I/usr/include/SDL2 -lSDL2

你得到的原因SDL.h: No such file or directory是因为pkg-config adds -I/usr/include/SDL2到包含搜索路径,以便您可以包含SDL.h在您的代码中(没有 SDL2 子目录)。

你得到的原因undefined reference错误是因为你没有-lSDL2(它告诉编译器链接 libSDL2)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 SDL2 库与 pkg-config 链接 的相关文章

随机推荐

  • AOL 的开发者 API 密钥问题

    我正在使用 AOL 登录创建一个新应用程序 为此 我需要开发人员 api 密钥 我获取了 Facebook twitter 的 api 密钥 但对于 aol com 当我打开 dev aol com 时 它总是重定向到 www aol co
  • 通过 ajax 刷新数据时覆盖表单“重置”行为

    我依靠表单的 重置 行为来取消编辑 我面临的问题是 一旦发布数据通过ajax更新 重置仍然会恢复到最初随页面加载的数据 所以基本上我需要做的是 重置 重置 功能 合理 尝试这个 yourForm bind reset function re
  • 如何比较两个具有非连续顺序的随机数的文件?

    有 2 个名为 compare 1 txt 和 compare2 txt 的文件 其中包含非连续顺序的随机数 猫比较1 txt 57 11 13 3 889 014 91 猫比较2 txt 003 889 13 14 57 12 90 Ai
  • 如何在不使用边框的情况下更改 a 标签的下划线粗细?

    我经常对按钮使用 a 标签 因此它们有一个填充 使它们像按钮一样 如何更改文本装饰下划线的粗细 人们经常建议为此使用边框底部 但是 底部边框不是下划线 有些字母甚至延伸到下划线以下 下划线比某物下面的线复杂得多 正如所解释的 我已经使用了相
  • 如何将 .NET 库移动到子目录?

    我想将我的应用程序使用的所有库 dll 放入一个子目录 假设名为 lib 如何指示程序集加载器在该特定目录 这是主程序集所在的目录的子目录 中查找引用的程序集 我认为应该通过 app config 中的一些设置来完成 对吗 探测路径 htt
  • 哈希表中关键内容的最佳实践

    最好的查找结构是HashTable 它提供持续的访问一般 最坏情况下呈线性 这取决于哈希函数 好的 我的问题如下 假设一个良好的实施HashTable e g HashMap关于映射中传递的键是否有最佳实践 我的意思是建议键必须是不可变的对
  • 为什么这个从未来列表到未来列表的转换能够编译并起作用?

    免责声明 下面的代码片段与正在进行的 Coursera 课程之一相关 我们假设它只是出于学习目的而发布 不应用于作为家庭作业的解决方案提交 正如下面的评论所述 我们需要将 Future 列表转换为列表的单个 Future 更重要的是 如果至
  • 如果条件唯一,MySQL 的非重复计数

    我正在尝试构建一个查询 告诉我给定数据集中有多少个不同的女性和男性 该人通过号码 电话 来识别 同一个 tel 可以出现多次 但该 tel 的性别只能计算一次 7136609221 男7136609222 男7136609223 女7136
  • 具有多个组的导航视图根据条件隐藏和显示组

    I have NavigationView具有多个组 基于某些条件我需要隐藏和显示组 我怎样才能实现这个目标 我的样品NavigationView menu menu menu
  • 我该如何修改这个SQL语句呢?

    我的 SQL Server 视图 SELECT geo HyperLinks CatID geo Tags Tag geo HyperLinks HyperLinksID FROM geo HyperLinks LEFT OUTER JOI
  • 快速 cookie 返回未定义

    我试图在express js 上设置cookie 但它返回未定义 我搜索了很多网页并把express cookieParser above app use app router 但它仍然无法返回正确的值 app js app configu
  • 平滑画布动画

    我正在尝试学习如何使用 HTML5 的画布创建流畅的 JavaScript 动画 由于某种原因 动画并不流畅 而是有点 溅射 你可以看到我构建的框架这个jsFiddle http jsfiddle net 3TAVu 目前仅使用 Webki
  • C++ 模板“延迟实例化”

    C 模板中的 延迟实例化 是什么意思 延迟实例化是指直到第一次使用相应实体时才实例化模板 例如 您有一个模板化函数 template
  • javascript创建多维数组语法[重复]

    这个问题在这里已经有答案了 今天我听说可以使用以下语法在 js 中创建多维数组 var a new Array 3 3 a 2 2 2 alert a 2 2 然而这在歌剧中不起作用 我有什么地方说错了吗 是的 你有地方错了 var a n
  • git 存储库在 Linux 中从 jenkins 连接时出现 403 错误

    嗨 我只想将我的项目从 github 配置到 jenkins 来生成 build gradle 文件 我收到以下错误 Failed to connect to repository Command usr bin git ls remote
  • 如何在IPython中自动设置默认路径

    我使用 WingIDE 进行开发 使用 Ipython 运行脚本 我在几个方面面临一些不便 每当我更新代码时 我都必须重新加载模块才能在 IPython 中更新它 为了解决我遵循的问题绳文杉 https stackoverflow com
  • 如何从 jenkins 构建 Visual Studio 安装程序项目(.vdproj)以生成 .exe 和 .msi 文件?

    我有一个 Visual Studio 安装程序项目 vdproj 我想从 jenkins 构建它 有人可以为我提供解决方案吗 我尝试使用 msbuild 但它不适合我 然后我在批处理文件中尝试了以下操作 devenv exe pathToP
  • AngularUI:为什么模态没有作为指令实现?

    我在我的项目中使用 Angular ui 我想实现一个模式窗口 库的大部分组件 http angular ui github io bootstrap http angular ui github io bootstrap 作为指令实现 如
  • 在 GWT 中需要应用程序范围的 CSS 常量

    我想在 GWT CssResource 中将一些颜色定义为常量 并在整个应用程序中使用这些常量 但我不知道该怎么做 我会告诉你我已经尝试过什么 我创建了一个 ClientBundle 和一个 CssResource 如下所示 public
  • 将 SDL2 库与 pkg-config 链接

    我使用的是 Ubuntu 14 04LTS 我已经通过从源代码编译安装了 SDL2 库 方法 1https askubuntu com questions 344512 what is the general procedure to in