首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >g++与DevIL:无法链接

g++与DevIL:无法链接
EN

Stack Overflow用户
提问于 2015-03-27 23:01:19
回答 2查看 2.1K关注 0票数 0

首先,我正在使用Fedora和学习OpenGL。我想使用一下DevIL,所以我从官方存储库中安装了DevIL和DevIL软件包。我有一个加载和呈现文件的测试代码,所以我决定对它进行测试(我将在我的课程中学习一些DevIL基础知识,并向我们提供该文件以确保DevIL对我们正常工作)。

该文件包含行:

代码语言:javascript
复制
#include "IL/devil_cpp_wrapper.hpp"

因此,我用测试文件将IL目录(我们也可用)复制到目录中(IL目录包含大量头文件,例如il.h、ilut.h、ilu.h、.)。但是,构建失败了。

代码语言:javascript
复制
#include <IL/ilut.h>

来自IL/cpp_cpp_Wrapper.hpp文件。我不明白,因为我安装了软件包。我试着将所有可能的参数都放入g++ (因为我没有找到任何有用的手册,也许我只是瞎了眼)、-lIL、-lILU、-lILUT、-ldevil,因为每一种可能都会给我带来同样的错误。我无法找到任何合适的解决方案,所以我放弃并将IL目录复制到/usr/include。这一次,它给了我这个错误,每个库包括:

代码语言:javascript
复制
/usr/bin/ld: cannot find <param>

因此,我删除了目录,并尝试将所有系统包含(如devil_cpp_wrapper.hpp中的)替换为目录中的系统包含(因为文件被称为相同的文件)。链接器也有同样的问题,所以我删除了所有的库参数,并再次编译它,这一次在针对特定于魔鬼的函数的“未定义引用”上失败。

我们还为dll (DevIL.dll、ILU.dll、ILUT.dll)和.lib提供了一些文件,我也试图链接它们,但仍然得到相同的未定义引用错误。另外,本课程主要针对VS用户,所以我不确定我应该包括哪些文件。

我还尝试从他们的github源代码构建DevIL,就像在他们的README.unix文件中那样,但是在第一步就失败了( autoconf -i对于某些libILUT.la失败了;我也尝试了autoconf -i,以防他们写错了,它对于未定义的win32宏失败)。

所以,我的问题是:我是一个不能链接DevIL的菜鸟。我试过了我能想到的一切,但都找不到解决办法。有谁可以帮我?

编辑:由于github的构建失败,我决定给它一个机会,下载他们的.tar,并尝试从它编译。它一开始似乎在工作,但随后返回“对`png_set_gray_1_2_4_to_8的未定义引用”和"collect2: error: ld返回了1个退出状态“。即使在此之后,我也尝试使用make完成构建,当然这也失败了,但在这次尝试中,我在/usr/local/lib中引入了一些库。但是,我仍然不能编译我的测试程序,因为前面提到的对png_set_gray_1_2_4_to_8的未定义引用,链接器现在抱怨它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-28 01:51:50

在Linux上使用库有很多选择。这通常是相当容易的,但你似乎偶然发现了一些常见的问题。

规则1:自己不要碰/usr/usr/local

/usr目录用于系统安装的包(例如Debian、Ubuntu或Mint上的apt-get ),因此您几乎不应该碰它。

/usr/local目录用于您安装的包(假设您是计算机的管理员),但是您不手动地在那里复制文件。相反,您可以运行自动将文件放在那里的安装脚本。

通常,您的安装方式如下:

代码语言:javascript
复制
./configure
make
sudo make install

规则2:首先使用包管理器。

包管理器取决于您使用的Linux发行版。例如,在基于Debian的系统上,包系统是"apt",您可以使用突触、智能或apt获取来安装软件包。

在我的系统中,我会运行以下命令:

代码语言:javascript
复制
sudo apt-get install libdevil-dev

-dev的意思是“开发”,因此它包含了编译使用DevIL的程序所需的头。

规则3:如果您从源代码编译,在查看GitHub之前获得一个适当的版本。

适当的版本将有configure脚本。因为您是从GitHub下载的,所以您必须调用autoconf,这意味着在您的系统上安装更多的包。不用费心,只要拿一个合适的源代码发布即可。

规则4:始终使用构建系统。

您没有提到如何编译东西,所以我担心您可能只是在命令行上输入gcc。这是一种让人沮丧的方法。

下面是一个makefile,您可以使用它来编译一个简单的C++程序,它使用DevIL,假设您的程序都在main.cpp

代码语言:javascript
复制
all: myprog
clean:
    rm -f myprog *.o

devil_cflags := $(shell pkg-config --cflags IL)
devil_libs := $(shell pkg-config --libs IL)

CXXFLAGS := -O0 -g -Wall -Wextra $(devil_cflags)
LIBS := $(devil_libs)

myprog: main.o
    c++ $(LDFLAGS) -o $@ $^ $(LIBS)

这使用pkg-config来了解如何与DevIL链接。这比自己写链接标志要好得多。

注意,Makefile中的缩进必须用制表符来完成,不能使用空格。

票数 4
EN

Stack Overflow用户

发布于 2015-03-28 00:29:53

为了添加一个新的库,您应该在lib中复制文件,并将目录包含到usr文件夹中的适当位置。否则编译器将无法找到库所在的位置。

我不确定目录名,但它应该放在这些文件夹中:

对于标题: usr/local/include

对于libs : usr/local/lib

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29311547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档