指定C++应用程序静态库的位置在Linux中
首先,我希望我问的问题在这里正确的背景下...指定C++应用程序静态库的位置在Linux中
我构建C++使用代码::块的应用程序。该应用程序使用由第三方提供的静态库,并且不能通过软件包管理安装在系统上。因此,当我分发我的应用程序时,我会运送这些库
这里是我的目标配置是这样的:
<Target title="Unix_162">
<Option output="bin/my_app" prefix_auto="1" extension_auto="1" />
<Option working_dir="/home/marco/third_party_dist/lib" />
<Option object_output="obj/Unix_162" />
<Option type="1" />
<Option compiler="gcc" />
<Option use_console_runner="0" />
<Option parameters="-c" />
<Compiler>
<Add directory="/home/marco/third_party_dist/include" />
</Compiler>
<Linker>
<Add library="/home/marco/third_party_dist/lib/lib1.so" />
<Add library="/home/marco/third_party_dist/lib/lib2.so" />
<!-- some more included the same way -->
<Add directory="/home/marco/third_party_dist/lib" />
</Linker>
</Target>
我可以建立这个目标罚款,并运行它。一切正常。
今天,我试图在Debian Squeeze上运行,并刚刚复制了一个包含可执行文件和第三方库的文件夹。我认为只要一切都在一个文件夹中,可执行文件就会找到.so文件。我错了。我得到的消息:
/home/my_app/my_app: error while loading shared libraries: lib1.so: cannot open shared object file: No such file or directory
因为代码::块能够设置工作目录为可执行文件我没有得到我的研究与开发的机器上这条消息。我可以通过将.so文件的位置放在/etc/ld.so.conf.d/my_app.conf中来删除错误消息...
是否有无论如何我可以构建可执行文件,以便它搜索库在执行目录中?或者这是Debian特有的问题?或者我可以在执行可执行文件之前指定进程的工作目录?
我想避免更改系统配置/环境之前,您可以启动应用程序...
首先,这些不是静态库(它们是共享的)。
所以问题是在运行时定位库。
有几种方法可以做到这一点:
1)设置LD_LIBRARY_PATH
环境变量。
这就像PATH,但对于共享库。
2)在可执行文件中设置rpath。
这是被逼到哪里是搜索共享库
-Wl,-rpath,<LIB_INSTALL_PATH>
这可以被设置为.
,这将使它看起来在当前目录中的可执行的路径。
或者您也可以设置为'$ORIGIN'
这将使它看起来在应用程序安装目录。
3)您可以将它们安装到共享库的默认位置之一。
往里/etc/ld.so.conf
但通常/usr/lib
和/usr/local/lib
4)你可以添加更多的默认位置
修改/etc/ld.so.conf
是有,你必须通过选项-rpath <path>
到链接器,其中<path>
是你的库的路径(类似于到选项-L
)。
此外,您可能正在谈论共享库,而不是静态个。
这个
相对于我猜测的链接器的工作目录。 – scai 2012-08-02 15:01:18
这是我通过参数时发生的情况:g ++:error:无法识别的选项'-R' – 2012-08-02 15:01:21
I thought that as long as everything is in one folder the executable will find the .so files. I was wrong.
需要一个额外的步骤,以使Linux动态链接程序的外观在同一个共享库目录作为可执行文件。将可执行文件链接到-Wl,-rpath,'$ORIGIN'
选项(在makefile中$
需要引用,如-Wl,-rpath,'$$ORIGIN'
)。有关更多详细信息,请参阅$ORIGIN and rpath note。
解决方案2)对我来说听起来不错。我现在不知道在哪里放置这些参数。我是否必须将它们放入“其他链接器选项”中,是否在运行时/执行前传递它们? – 2012-08-02 15:09:45
您在链接时通过它们。它假定您使用g ++/gcc来链接应用程序。 – 2012-08-02 15:12:48
非常感谢!我在Code :: Blocks的“其他链接器选项”文本字段中传递了参数,并假定这是在链接时完成的。我将应用程序复制到debian系统,它开始就好了! – 2012-08-02 15:16:29