• 11597阅读
  • 8回复

求解:Qt  creator 中LIBS参数为何使用失效??(内含解决办法) [复制链接]

上一主题 下一主题
离线ccnuliughai
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-26
— 本帖被 XChinux 执行加亮操作(2010-09-03) —
背景:在Ubuntu下,已经利用Qt creator生成了动态库文件,希望能在另外一个主程序中调用该动态库文件;因为日后生成的动态库文件会比较多,为了方便管理,希望能把动态库文件专门放在一个目录下面,当然头文件也放在一个目录下面;我按照网上在pro中使用INCLUDEPSATH和LIBS 参数,发现.h文件可以找到,.so却不行啊。LIBS 参数尝试过很多次,检查了N遍,编译的时候,总是提示说找不到这个动态库文件。郁闷!

我之后将动态库文件拷贝到主程序当前目录,修改LIBS ,这样就可以。这让我更是无语。

问题:为什么我的Qt creator 中的LIBS就不能引用其他目录下的动态库文件呢?求原因,求正解!




[ 此帖被ccnuliughai在2010-08-27 11:23重新编辑 ]
离线ccnuliughai
只看该作者 1楼 发表于: 2010-08-26
另外发现,当把.so文件拷贝到主程序当前目录下时,使用IDE 编译链接执行都是成功的,可是当我直接双击生成的可执行程序图标时,则没有反应。
后来,我把.so使用root身份拷贝到系统/lib目录下,再次双击,结果运行成功。

试问:我的可执行程序不会都要把动态库拷贝到系统/lib目录下才可以直接运行吧?这样可真是太悲惨了阿。
离线dbzhang800

只看该作者 2楼 发表于: 2010-08-26
引用楼主ccnuliughai于2010-08-26 17:16发表的 求解:Qt  creator 中LIBS参数为何使用失效?? :
背景:在Ubuntu下,已经利用Qt creator生成了动态库文件,希望能在另外一个主程序中调用该动态库文件;因为日后生成的动态库文件会比较多,为了方便管理,希望能把动态库文件专门放在一个目录下面,当然头文件也放在一个目录下面;我按照网上在pro中使用INCLUDEPSATH和LIBS 参数,发现.h文件可以找到,.so却不行啊。LIBS 参数尝试过很多次,检查了N遍,编译的时候,总是提示说找不到这个动态库文件。郁闷!
我之后将动态库文件拷贝到主程序当前目录,修改LIBS ,这样就可以。这让我更是无语。
问题:为什么我的Qt creator 中的LIBS就不能引用其他目录下的动态库文件呢?求原因,求正解!

.......

链接时找不到库,说明你的LIBS写得有问题
离线dbzhang800

只看该作者 3楼 发表于: 2010-08-26
引用第1楼ccnuliughai于2010-08-26 17:22发表的  :
另外发现,当把.so文件拷贝到主程序当前目录下时,使用IDE 编译链接执行都是成功的,可是当我直接双击生成的可执行程序图标时,则没有反应。
后来,我把.so使用root身份拷贝到系统/lib目录下,再次双击,结果运行成功。
试问:我的可执行程序不会都要把动态库拷贝到系统/lib目录下才可以直接运行吧?这样可真是太悲惨了阿。

既然用linux,而且是linux下的程序员,一些基础的工具还是要了解的,有疑问围着 ldconfig 转就行了
离线ccnuliughai
只看该作者 4楼 发表于: 2010-08-26
引用第3楼dbzhang800于2010-08-26 17:58发表的  :
既然用linux,而且是linux下的程序员,一些基础的工具还是要了解的,有疑问围着 ldconfig 转就行了



这个能说的更具体一点吗?还是个新手。谢谢!
离线dbzhang800

只看该作者 5楼 发表于: 2010-08-26
Once a program has been linked to use shared libraries, it must be able to find the shared
library when it runs. The libraries are located by name, not by directory, so it is possible
to link the program against one copy of the library and run it using another. This can,
of course, cause problems if you switch from one version of the library to another
without updating the program—which is the reason most libraries include a version
number as part of the name (for example, libm.so.6 or libutil-2.2.4.so).
Whenever a program loads and prepares to run, the shared libraries it needs are
sought in the following places:
■ Each of the directories listed in the colon-separated list in the environment
variable LD_LIBRARY_PATH
■ The list of libraries found in the file /etc/ld.so.cache, which is maintained
by the ldconfig utility
■ The directory /lib
■ The directory /usr/lib
If you want to find out which libraries are being loaded and used by a specific
application, you can use the ldd utility described later in this chapter.
Another environment variable, LD_PRELOAD, can contain a list of shared library
names (separated by spaces, tabs, or newlines) that will be preloaded before any other
library searching takes place. In this way, you can override the functions that would
normally be loaded from a shared library. For security reasons, some limitations are
imposed on this technique for setuid programs.
离线ccnuliughai
只看该作者 6楼 发表于: 2010-08-26
引用第5楼dbzhang800于2010-08-26 19:10发表的  :
Once a program has been linked to use shared libraries, it must be able to find the shared
library when it runs. The libraries are located by name, not by directory, so it is possible
to link the program against one copy of the library and run it using another. This can,
of course, cause problems if you switch from one version of the library to another
without updating the program—which is the reason most libraries include a version
.......


虽说还是似懂非懂状态,但还是谢谢dbzhang800这个仁兄。
上面一段英文,第一段的概念是我第一回见到的,详细的意思到还不是很明白。
后面大概说是,需要进行环境变量的设置,让程序执行的时根据设置好的路径去寻找动态库文件吧?默认的路径是usr/lib 和 lib.
是这个意思吗?
离线ccnuliughai
只看该作者 7楼 发表于: 2010-08-27
经过一天的努力,拜读了诸多牛人的博客好贴好,问题得到了解决。
1、关于LIBS 失效的问题,我昨天一个下午一直在creator 中的.pro文件中尝试,可在编译过程中一直说找不到动态库。今天重新启动了电脑之后,再次尝试LIBS指点库搜索目录,惊奇地发现已经可以在编译过程中找到动态库了,只是还不能在执行程序的时候正确加载动态库文件(这是另外一个层面的问题,稍候解决)。如果你也曾遇到国这样的问题,还是建议先重启下机器吧。呵呵

2、编译通过了,可以主程序目录下面看到已经生成了一个可执行文件,双击它,发现并不能运行。很显然,这是由于加载动态库不成功所造成的。在编译和执行两个过程中,动态库的搜索路径是需要分开设置的,这里所说的分开,并非是指他们需要有不同的搜索路径,而是指他们的设置是独立的。我们在.pro文件中参数LIBS设置的只是编译链接是程序找这个动态库的路径(注意 程序链接完成后,并没把动态库代码加载到程序里);程序执行的时候,还需要把用到的动态库文件进行加载。只有在所有的动态库加载成功后程序才能执行。加载库文件同样需要路径来搜索,如果你不设定好这个搜索路径,那么程序自然无法找到你所需的动态库文件了。简而言之:当你使用动态库时,编译和执行过程都需要你去设定好动态库搜索路径。

3、编译过程路径的设定:在.pro文件里,增加参数LIBS
    举例说明: LIBS  += -L/home/administrator/Application/shareobject  -lshareobject  
    含义:指定在编译过程,到/home/administrator/Application/shareobjec 目录下面去找libshareobject.so.*文件。
    LIBS的具体 用法可以参考qmake手册

    执行过程路径的设定:法一:在etc/ld.so.conf添加库文件路径,并使用ldconfig命令更新ld.so.cache文件。
                                    法二:修改LD_LABRARY_PATH ,没试过,因为涉及到全局,很多人说这个不太好。
    具体讲下法一,以root身份打开终端,cd到etc目录下,终端输入  gedit ld.so.conf 打开文件,在下一行添加路径,
                       例如:/home/administrator/Application/shareobjec
    保存文档。
    终端输入:ldconfig,更新ld.so.cache。设置完成了。

4、双击可执行程序,发现已经可以运行了。enjoy it!


                          


离线wsndbd
只看该作者 8楼 发表于: 2010-12-23
Re:求解:Qt  creator 中LIBS参数为何使用失效??(内含解决办法)
谢谢楼主了......
快速回复
限100 字节
 
上一个 下一个