2019-04-25 21:12:51 leibihui0556 阅读数 172

安装安装 32 位的兼容库 提示以下错误

vmuser@linux-host:~$ sudo apt-get install ia32-libs
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package ia32-libs is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
 lib32ncurses5 lib32z1

E: Package 'ia32-libs' has no installation candidate

解决方法

12.04下面:sudo apt-get install ia32-libs
14.04下面:sudo apt-get install libglib2.0-0:i386

2018-03-20 14:44:06 byxdaz 阅读数 1735
一、编译链接库(a库和so库)方法
一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要include含有库中提供的函数接口声明的头文件即可。
在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项:          
d -----从指定的静态库文件中删除文件          
m -----把文件移动到指定的静态库文件中          
p -----把静态库文件中指定的文件输出到标准输出          
q -----快速地把文件追加到静态库文件中          
r -----把文件插入到静态库文件中          
t -----显示静态库文件中文件的列表          
x -----从静态库文件中提取文件      
还有多个修饰符修改以上基本选项,详细请man ar
ar 命令的命令行格式如下:      
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... 参数archive定义库的名称, files是库文件中包含的目标文件的清单, 用空格分隔每个文件. 比如创建一个静态库文件的命令如下: 
ar -r libapue.a error.o errorlog.o lockreg.o
动态库
1.创建共享库      gcc -fPIC -shared -o libapue.so error.o errorlog.o 这样就创建了共享库!。
2.编译共享库     假设共享库位于当前目录(即跟程序文件相同的目录中) gcc -o test -L. -lapue test.c 这样就编译出了不包含函数代码可执行文件了,但是你运行时会发现linux动态加载器打不到libapue.so文件. 可以用ldd 命令查看可执行文件依赖什么共享库: ldd test 如何才能让动态加载器发现库文件呢?有两种方法可以解决: LD_LIBRARY_PATH 环境变量和/etc/ld.so.conf文件    
1).环境变量        export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:."    
2).修改/etc/ld.so.conf文件.位于/etc/ld.so.conf 一般应用程序的库文件不与系统库文件放在同一个目录下,一般把应用程序的共享库文件放在/usr/local/lib下,新建一个属于自己的目录apue,然后把刚才libapue.so复制过去就行了 同时在/etc/ld.so.conf中新增一行: /usr/local/lib/apue 以后在编译程序时加上编译选项: -L/usr/local/lib/apue -lapue 这样就可以使用这个libapue.so共享库了。

Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊。

标准库连接方式示例连接选项优点缺点
全静态-static -pthread -lrt -ldl不会发生应用程序在 不同 Linux 版本下的标准库不兼容问题。生成的文件比较大,
应用程序功能受限(不能调用动态库等)
全动态-pthread -lrt -ldl生成文件是三者中最小的比较容易发生应用程序在 
不同 Linux 版本下标准库依赖不兼容问题。
半静态 (libgcc,libstdc++)-static-libgcc -L. -pthread -lrt -ldl灵活度大,能够针对不同的标准库采取不同的链接策略,
从而避免不兼容问题发生。
结合了全静态与全动态两种链接方式的优点。
比较难识别哪些库容易发生不兼容问题,
目前只有依靠经验积累。
某些功能会因选择的标准库版本而丧失。
二、a库和so库生成实例
1、生成a库
首先,你需要写几个你要调用的函数的源文件,如print.cpp、sum.ccpp等。其代码如下:
//print.h
#include <stdio.h>
void printhello();
//print.cpp
#include "print.h"
void printhello()
{
 printf("Hello, world\n");
}
//sum.h
#include <stdio.h>
void sum(int a,int b);
//sum.cpp
#include "sum.h"
void sum(int a,int b)
{
 int r = 0;
 r = a + b;
 return r;
}
开始编译,将源文件编译成.o文件。命令行指令如下:
g++ -c print.cpp sum.cpp
然后开始生成a库,指令如下:
ar rcs libtest.a print.o sum.o
注意:链接库前缀必须以lib开头
得到libtest.a库文件后,然后将.a库链接到主程序中,写主程序main.cpp和头文件main.h 。
//main.h
int printhello();
int sum(int a,int b);
//main.cpp
#include "main.h"
int main(void)
{
 printhello();
 int a = sum(10,1);
 printf("%d\n",a);
 return 0;
}
加载a库,生成可执行文件并执行,指令如下:g++ main.cpp -L. -ltest -o test
2、生成so库
利用上面所写过的print.cpp和sum.cpp生成.so库的指令如下:
g++ print.cpp sum.cpp -fPIC -shared -o libtest.so
同样so库的前缀必须为lib,然后将.so库链接到主程序main.c中,这里需要注意一下,因为动态库的特性,编译器会到指定的目录去寻找动态库,目录的地址在/etc/ld.so.conf.d/ 目录里的libc.conf文件里,你可以在里面加一行地址表示你so库的位置,更改完conf文件里的内容,记得输入命令行:ldconfig。
你还可以将so库复制到默认的目录下。这里是将so库复制到了默认目录下,生成可执行文件并运行,指令如下:
g++ main.cpp -L. -ltest -o test
静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库的链接固定写入在程序中,而动态链接库则是在每次程序运行再加载链接。
在加载动态链接库的时候,有可能会遇到加载不到的错误,原因在于系统默认加载的动态链接库路径里没有找到你的动态库,有三种解决方法:
1.在执行gcc main.c -L. -ltest -o main 前,执行 export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
2.将你so所在的目录写到/etc/ld.so.conf文件里,然后执行ldconfig。
3.将你的so放在/etc/ld.so.conf里的路径位置里。
三、Linux 静态库转换为动态库
使用ar -x 命令将.a文件转为.so文件。
ar -x mylib.a
gcc -shared *.o -o mylib.so
linux中如何将多个静态库合并成一个

四、gcc系强制链接静态库(同时有.so和.a)
1. 坑多的办法
-static
如果需要链接成不依赖任何so文件的程序,用ldd查看显示为"not a dynamic executable",但是这个选项时不推荐的。
2. 普遍的做法
就是直接连接.a文件全路径,这没啥好说的,就把它当.o文件一样链接。
g++ test-boost.cpp -o test -I /home/johnchen/boost_1_56_0/include /home/johnchen/boost_1_56_0/lib/libboost_system.a /home/johnchen/boost_1_56_0/lib/libboost_filesystem.a
3. 优雅的做法
既然是库,-l和-L才是正派的做法,比如同一目录下有libxxx.a文件和libxxx.so文件,gcc默认会链接so,改变这一默认行为的方法就是:将"-lxxx"改为"-l:libxxx.a"
g++ test-boost.cpp -o test -I /home/johnchen/boost_1_56_0/include -L /home/johnchen/boost_1_56_0/lib -l:libboost_system.a -l:libboost_filesystem.a
2018-03-03 14:15:26 Jacob_job 阅读数 316

前言

对于嵌入式linux开发而言,这是一个很基础但是很有用的技巧。
嵌入式的linux文件系统一般会设计成只读型,但是在调试过程经常需要修改目标文件或者*.so动态库文件。目标文件运行时默认会从/usr/lib等目录读取so文件,但是这些目录是只读型的,修改不了so文件。解决方法就是把新修改的so文件放在共享目录,比如nfs共享目录,这里写成/tmp/nfsfile。然后改变环境变量,让目标文件优先从指定目录读取so文件。

在终端执行命令

export LD_LIBRARY_PATH=/tmp/nfsfile:$LD_LIBRARY_PATH

其中/tmp/nfsfile根据实际修改成对应的目录

2012-11-21 22:47:22 weidong_it 阅读数 198

今天在linux下安装了mysql,总的来说还是比较简单的,记录下来,以备后用

安装环境:

Red Hat  Linux 5   -32bit 

1安装MySQL需要下面两个文件:
  MySQL-server-4.0.16-0.i386.rpm   
  MySQL-client-4.0.16-0.i386.rpm
下载地址为:http://www.mysql.com/downloads/mysql-4.0.html

2 安装服务器端

[root@localhost mysql]# rpm -ivh MySQL-server-4.0.16-0.i386.rpm

Starting mysqld daemon with databases from /var/lib/mysql
  如出现如上信息,服务端安装完毕。测试是否成功可运行netstat看Mysql端口是否打开,如打开表示服务已经启动,安装成功。Mysql默认的端口是3306。
[root@localhost mysql]# netstat -nat
    Active Internet connections (servers and established)
  Proto Recv-Q Send-Q Local Address      Foreign Address     State   
  tcp  0  0 0.0.0.0:3306     0.0.0.0:*      LISTEN   
  上面显示可以看出MySQL服务已经启动
    如果没有出现3306端口,查看出现问题(详见解决问题1)

3 安装客户端
  [root@localhost mysql]# rpm -ivh MySQL-client-4.0.16-0.i386.rpm
  warning: MySQL-client-4.0.16-0.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5
  Preparing...    ########################################### [100%]
  1:MySQL-client  ########################################### [100%]
  显示安装完毕。
  用下面的命令连接mysql,测试是否成功。


4安装成功
[root@localhost mysql]# mysql
  Welcome to the MySQL monitor. Commands end with ; or \g.
  Your MySQL connection id is 1 to server version: 4.0.16-standard
  Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
  mysql>

 

问题1

[root@localhost mysql]# mysql
 Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

解决办法

[root@localhost home]# /etc/rc.d/init.d/mysqld status     //先查看mysql是否已经启动
[root@localhost home]# mysql -uroot -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
原因是,/var/lib/mysql 的访问权限问题
[root@localhost home]# chown -R mysql:mysql /var/lib/mysql
[root@localhost home]# /etc/init.d/mysql start
Starting MySQL.....   [ok]       //成功

 

2017-11-14 09:47:50 azhou46 阅读数 1150

手工创建数据库步骤:
Step 1: Specify an Instance Identifier (SID)
Step 2: Ensure That the Required Environment Variables Are Set
Step 3: Choose a Database Administrator Authentication Method
Step 4: Create the Initialization Parameter File
Step 5: (Windows Only) Create an Instance
Step 6: Connect to the Instance
Step 7: Create a Server Parameter File
Step 8: Start the Instance
Step 9: Issue the CREATE DATABASE Statement
Step 10: Create Additional Tablespaces
Step 11: Run Scripts to Build Data Dictionary Views
Step 12: (Optional) Run Scripts to Install Additional Options
Step 13: Back Up the Database.
Step 14: (Optional) Enable Automatic Instance Startup

Step 1: Specify an Instance Identifier (SID)
先确认一个唯一的sid
export ORACLE_SID=myoracle

Step 2: Ensure That the Required Environment Variables Are Set
设置环境变量
su - oracle
vi .bash_profile
添加对应的环境变量(主要是ORACLE_BASE,ORACLE_HOME ,sid也要以在这设置)
PATH=PATH:HOME/bin
export PATH
export ORACLE_BASE=/home/oracle/app
export ORACLE_HOME=ORACLEBASE/oracle/product/11.2.0/dbhome1exportORACLESID=myoracleexportPATH=PATH:HOME/bin:ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib

Step 3: Choose a Database Administrator Authentication Method
(此步骤可以忽略,不是必要)

Step 4: Create the Initialization Parameter File
创建pfile
在$ORACLE_HOME/dbs下创建pfile文件 命名为init.ora
vim intmyoracle.ora
往里面添加以下内容

myoracle.__db_cache_size=205520896
myoracle.__java_pool_size=4194304
myoracle.__large_pool_size=4194304
myoracle.__oracle_base=’/home/oracle/app’#ORACLE_BASE set from environment
myoracle.__pga_aggregate_target=251658240
myoracle.__sga_target=473956352
myoracle.__shared_io_pool_size=0
myoracle.__shared_pool_size=251658240
myoracle.__streams_pool_size=0
*.audit_file_dest=’/home/oracle/app/admin/myoracle/adump’
*.audit_trail=’db’
*.compatible=’11.2.0.0.0’
*.control_files=’/home/oracle/app/oradata/myoracle/control01.ctl’,’/home/oracle/app/flash_recovery_area/myoracle/control02.ctl’
*.db_block_size=8192
*.db_domain=”
*.db_name=’myoracle’
*.db_recovery_file_dest=’/home/oracle/app/flash_recovery_area’
*.db_recovery_file_dest_size=4070572032
*.diagnostic_dest=’/home/oracle/app’
*.dispatchers=’(PROTOCOL=TCP) (SERVICE=myoracleXDB)’
*.memory_target=725614592
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile=’EXCLUSIVE’
*.sec_case_sensitive_logon=FALSE
*.undo_tablespace=’UNDOTBS1’

注:
1、memory_target 要小于操作系统的 tmpfs ,tmpfs可以通过以下命令查看df -h |grep tmpfs
2、如果存在没有的目录要先建好,不然会报错,手工创建数据库不同于dbca创建数据库,dbca会自动帮你创建一些目录,但是手工创建库一切都要自己手工创建目录

Step 5: (Windows Only) Create an Instance
windows 环境下的步骤

Step 6: Connect to the Instance
创建完参数文件后,可以连接到数据库
[oracle@localhost dbs]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 14 17:26:28 2017
Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected to an idle instance.

Step 7: Create a Server Parameter File
创建spfile
SQL> create pfile from spfile;
File created.
SQL>

Step 8: Start the Instance
把数据库起动成nomount状态
SQL> startup nomount
ORACLE instance started.
Total System Global Area 722366464 bytes
Fixed Size 2216864 bytes
Variable Size 511708256 bytes
Database Buffers 205520896 bytes
Redo Buffers 2920448 bytes
SQL>

Step 9: Issue the CREATE DATABASE Statement
用create database 语句来创建数据库
CREATE DATABASE myoracle
USER SYS IDENTIFIED BY oracle
USER SYSTEM IDENTIFIED BY oracle
LOGFILE GROUP 1 (‘/data/myoracle/redo01a.log’,’/data/myoracle/redo01b.log’) SIZE 100M BLOCKSIZE 512,
GROUP 2 (‘/data/myoracle/redo02a.log’,’/data/myoracle/redo02b.log’) SIZE 100M BLOCKSIZE 512,
GROUP 3 (‘/data/myoracle/redo03a.log’,’/data/myoracle/redo03b.log’) SIZE 100M BLOCKSIZE 512
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 100
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE ‘/data/myoracle/system01.dbf’ SIZE 325M REUSE
SYSAUX DATAFILE ‘/data/myoracle/sysaux01.dbf’ SIZE 325M REUSE
DEFAULT TABLESPACE users
DATAFILE ‘/data/myoracle/users01.dbf’
SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE ‘/data/myoracle/temp01.dbf’
SIZE 20M REUSE
UNDO TABLESPACE UNDOTBS1
DATAFILE ‘/data/myoracle/undotbs01.dbf’
SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
在sqlplus里面执行以上语句

创建表空间
CREATE TABLESPACE data LOGGING
DATAFILE ‘/data/myoracle/data1.dbf’
SIZE 500M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL;

– create a tablespace for indexes, separate from user tablespace (optional)
CREATE TABLESPACE indx_tbs LOGGING
DATAFILE ‘/data/myoracle/indx01.dbf’
SIZE 100M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL;
(该步骤可有可无,可以在数据startup状态下在做)

Step 11: Run Scripts to Build Data Dictionary Views
1、以sysdba运行以下脚本
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/utlrp.sql
2、以system用户运行以下脚本
@?/sqlplus/admin/pupbld.sql
这时候数据库已经能正常启动运行可以往里面建用户等

SQL> create user mydata identified by oracle
default tablespace data
account unlock;
User created.
SQL> grant create session to mydata ;
Grant succeeded.
SQL> grant connect, resource to mydata ;
Grant succeeded.
SQL>

Linux环境搭建MySql数据库

博文 来自: qq_45058939

这是一个很帅的作者!

博文 来自: liujinen_

Linux环境下生成.so动态库

博文 来自: cx1229
没有更多推荐了,返回首页