好的只是一个简单的问题。我在Windows上使用Visual C ++进行编程,并且为了学习目的已经更改为Ubuntu并在Code :: Blocks,CodeLite和Eclipse中启动。我使用SDL2
和GLEW
编写了一些简单的程序,以基于SDL2
窗口创建一个简单的OpenGL应用程序。我用命令下载了库:
sudo apt-get install ...
我的主要问题是:由于此应用程序依赖于外部库(SDL2
,glew
,flu
,OIS
),因此它不适用于其他Linux电脑。使用终端命令安装所有这些库后,程序将无法执行。我的问题是,是否可以构建不需要安装这些库的程序。例如,在Windows上,您将程序链接到SDL2.lib
并在SDL2.dll
文件夹中包含.exe
。我怎么能在linux上做到这一点。我对linux编程以及工作原理的经验很少,所以我希望这只是一个基本问题。 :)
答案 0 :(得分:18)
在Linux中,等同于dll
文件的是.so
个文件。所以你需要随身携带它们。
您还可以静态链接库。那些应该是.a
的结尾。有了这些,他们就会被直接汇编到你的程序中,你不需要提供这些。
更高级(类似Linux)的方法:
通常在Linux(现在作为Debian / Ubuntu的例子)中创建一个包(如果是debian .deb
- file - debian包)。在这些包中,您可以添加元信息,例如它所依赖的其他包(这些包可以通过apt-get安装)。
当您使用dpkg手动安装软件包时,它会告诉您缺少依赖项,您可以使用apt-get -f install
修复这些依赖项。您还可以创建自己的apt存储库,它将使用仅apt-get install ...
其他Linux发行版有其他包管理系统。这只是debian / ubuntu的一个例子。
答案 1 :(得分:5)
结合Hayt的好答案,我认为值得一提的是,“经典”UNIX方法将是“开箱即用”的解决方案。含义:您实际上指定了程序编译所需的“外部”依赖项;你基本上让人们只需下载一些源档案;提取后......运行
./configure
make
make install
或类似他们系统上的东西。
在这种情况下,“configure”工具会检查所有必需的依赖项。有关详细信息,请参阅here。
现在分发DEB,RPM,...包更为常见;但是能够从某个地方下载一些sources.tar.gz有一定的美感;运行这三个命令,并在几分钟内基于本地编译进行工作安装。特别是当您的用户可能希望对源代码进行更改时。但是,当然,这需要更多的思考 - 因为你想尽可能地限制你的“依赖”;换句话说:你想尽可能“标准化”。
答案 2 :(得分:2)
使应用程序易于安装的一种方法是打包它(假设Ubuntu在这里)。假设您构建了名为foobar
的应用程序。创建以下目录结构:
foobar_1.0/
|-- usr/local/bin
| `-- foobar
`-- DEBIAN/
`-- control
并将以下文本放在DEBIAN/control
文件中:
Package: foobar
Version: 1.0
Section: games
Priority: optional
Architecture: i386
Depends: libsdl2, libglew1.10, anotherLibrary, yetAnotherOne
Maintainer: Your Name <you@email.com>
Description: A neat package which does foo and bar
现在您可以使用
构建包dpkg-deb --build foobar_1.0
然后,您的用户必须使用foobar
安装dpkg -i foobar_1.0.deb
,foobar
会在/usr/local/bin
中安装/usr/bin
。此目录专用于您从源构建的软件或从非官方软件包安装的软件,以避免DEBIAN/control
(官方软件包中的二进制文件)中可能存在的名称冲突。
如果您的用户遗漏了您在apt-get -f install
中列出的任何依赖关系,他们会在安装时告知它。只需运行foobar
即可安装它们。删除div {
max-width: 200px;
border: dashed 1px grey;
}
div.flex {
display: flex;
flex-flow:row wrap;
}
h3 {
display: inline;
font-size: 1.6em;
border-bottom: 4px solid green;
}
也会将这些依赖项标记为未使用,因此系统会在用户卸载程序包时将其删除。