分页: 1 / 2

apt-get 如何知道要安装的软件的名字 [结]

发表于 : 2013-03-19 21:24
飞翔的薄荷
比如:
boost库:
sudo apt-get install libboost-dev
libcurl库:
sudo apt-get install libcurl4-openssl-dev

libboost-dev和libcurl4-openssl-dev这个名字是怎么来的,我知道他叫boost和libcur。
直接使用sudo apt-get install boost 是不行的。

答案:aptitude search boost

后续问题:boost库怎么使用呢? 编译通不过的,具体见3楼。
答案:
1、联网编译安装的方式:
g++ -Wall -o "main" "main.cpp" -std=gnu++0x -lrt -lpthread -static -lboost_system ( -lpthread -lboost_system是关键)
2、离线安装要设置库的路径,具体没有测试。

后续问题:如何编译低核心的可执行文件呢?具体见12楼。
无满意答案。

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-19 21:32
qy117121
aptitude search boost

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-19 22:03
飞翔的薄荷
用这个命令安装完成的boost库没法使用
改用sudo apt-get install libboost-all-dev也不行。
比如随便写点代码
[text]
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.wait();
std::cout << "Hello, world!\n";
return 0;
}


g++ -Wall -o "main" "main.cpp" (在目录 /home/kk/桌面/testboost 中)
/tmp/ccGkKz5a.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0xf9): undefined reference to `boost::system::generic_category()'
编译失败。
main.cpp:(.text+0x103): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x10d): undefined reference to `boost::system::system_category()'
/tmp/ccGkKz5a.o: In function `boost::system::error_code::error_code()':
main.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x10): undefined reference to `boost::system::system_category()'
/tmp/ccGkKz5a.o: In function `boost::asio::error::get_system_category()':
main.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[boost::asio::error::get_system_category()]+0x7): undefined reference to `boost::system::system_category()'
/tmp/ccGkKz5a.o: In function `boost::asio::detail::posix_tss_ptr_create(unsigned int&)':
main.cpp:(.text._ZN5boost4asio6detail20posix_tss_ptr_createERj[boost::asio::detail::posix_tss_ptr_create(unsigned int&)]+0x15): undefined reference to `pthread_key_create'
/tmp/ccGkKz5a.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::~posix_tss_ptr()':
main.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED5Ev]+0xf): undefined reference to `pthread_key_delete'
/tmp/ccGkKz5a.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::~posix_tss_ptr()':
main.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED5Ev]+0xf): undefined reference to `pthread_key_delete'
collect2: ld 返回 1
[/text]


哪位高手告诉我下怎么回事?

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-19 22:20
mraandtux
看下面的链接:
http://blog.csdn.net/lyuan13141234/arti ... ls/5667570
此外因页面美观整理了楼上的Log。

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 0:21
飞翔的薄荷
g++ -Wall -o "main" "main.cpp" -std=gnu++0x -lrt -lboost_system
编译成功结束了。
但是没法运行:
./main: error while loading shared libraries: libboost_system.so.1.53.0: cannot open shared object file: No such file or directory

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 8:12
wutong

代码: 全选

dpkg -l

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 10:22
YeLee
飞翔的薄荷 写了:g++ -Wall -o "main" "main.cpp" -std=gnu++0x -lrt -lboost_system
编译成功结束了。
但是没法运行:
./main: error while loading shared libraries: libboost_system.so.1.53.0: cannot open shared object file: No such file or directory
虽然说是缺库,但怎么你这boost的库要求版本那么新的?这是哪个版本的啊? :em20 :em20 :em20

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 10:45
飞翔的薄荷
YeLee 写了:虽然说是缺库,但怎么你这boost的库要求版本那么新的?这是哪个版本的啊? :em20 :em20 :em20
是这样的用sudo apt-get install libboost-dev的方法,下载下来的库不会使用,卸载了。
然后用网上的方法,离线下载安装boost,然后sudo ./bootstrap.sh;./b2 install。这样就是最新的库了。
加上-lboost_system就通过编译了。但是运行的时候说找不到动态库。我记得别人说boost默认为静态库,不知道这是怎么回事。

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 10:56
YeLee
假如你是自己手动安装的话,试一下看看那库装在什么地方吧,不过,记忆中没修改过prefix的话都是放在/usr/local下面的吧。假如那文件存在的话,想必是ld.so.conf里面没有加/usr/local/lib进去了吧。 :em20 :em20 :em20

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 11:04
eexpress
● as libboost-all
p libboost-all-dev - Boost C++ Libraries development files (ALL, def
p libboost-all-dev:i386 - Boost C++ Libraries development files (ALL, def

dev安装了干嘛。是做开发?
不会使用
dpkg -L libboost-all-dev |grep ".*\.h"
看头文件吧。

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 12:58
lxf1992521
一般用下面的方法:

代码: 全选

sudo apt-cache search <软件包大概名称>
即可!

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 14:01
飞翔的薄荷
dev安装了干嘛。是做开发?
有一个项目服务器在windows linux都要有。所以选择劲量跨平台编码。这几天才开始学习linux。
9楼的方法没有试过,已经把系统还原了。
使用 dpkg -L libboost-all-dev |grep ".*\.h" 在本机上可以编译执行了。

使用 -static 编译选项可以解决 找不到 libboost_system.so的问题。
g++ -Wall -o "main" "main.cpp" -std=gnu++0x -lrt -static -lboost_system

但是现在新问题有出来了:
ubuntu 12.04 编译出来的程序,在red hat linux 下没法跑,说是核心太低。kernel too old
用uname -a 看了下,一个是3.5 一个是2.6。

如何编译低核心的可执行文件呢?

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 14:11
eexpress
交叉编译?
其实最好去irc,一堆rh的家伙在。让他们编译出静态包。

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 14:22
飞翔的薄荷
irc ? 根据百度百科的介绍是一种网络聊天协议。
现在我编译出来的东西,都不知道最低核心是怎么要求的?
现在是不是用一个老旧的linux下,编译出来的东西,才能在大多数环境下跑?
还有就是,我不可能把源代码给别人的。

Re: apt-get 如何知道要安装的软件的名字

发表于 : 2013-03-20 15:49
zhw2101024
简单的说,不同的发行版头文件和库文件的默认位置是不一样的,所以想要编译出所有linux版本通用的二进制文件基本上是妄想。可以把头文件和库文件一起打包,然后做一个安装脚本,还要在安装脚本里添加语句用来设置系统搜索头文件和库文件的默认路径。