分析linux下的编译环境

  不论是windows下的程序,还是linux下的程序,开发环境都离不开三个目录:include、lib、bin,分别是头文件目录、库文件目录、运行文件目录。或许目录不叫这个名字,但却必不可少,除非你的程序是运行在虚拟机上或脚本文件如java、php、lua等。

  在windows下,可以不怎么关注这些东西,因为VS安装后默认了配置好了这些路径,如D:\Program Files\Microsoft
SDK\include,如果使用到一些开源的库,在VS下设置就好了。并且windows下程序运行时,如果在系统的dll(相当于lib了,只是封装为dll),目录下找不到相关dll,会查找当前目录下是否有相应的dll,所有很多windows下的程序把自己的dll放到当前程序目录下就OK了。

  然而linux并不这么容易。一个原因是linux下没有像VS一样统一的IDE(Qt
creator、code::block不错,但很多人不习惯用),都用gcc、g++来编译,如果不熟悉linux下这三个目录,让程序跑起来可能有点困难。尤其是使用了许多开源库的时候。

  linux的include默认有两个(可能有我不知道的吧),分别是/usr/include、/usr/local/include,gcc中用参数
-I可以指定其他目录

  lib目录默认则有三个,分别是/lib、/usr/lib、/usr/local/lib,gcc中用-L可以指定其他目录

  bin目录默认也有三个,分别是/bin、、/usr/bin、usr/local/bin。当然你可以用包含路径的指令来运行程序。

  当你编译一个开源的库时,如libev,在make install时(编译过程见另一篇随笔),通常会告诉你一些信息,如:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Libraries have been installed in:

   /usr/local/lib

If you ever happen to want to link against installed libraries

in a given directory, LIBDIR, you must either use libtool, and

specify the full pathname of the library, or use the `-LLIBDIR‘

flag during linking and do
at least one of the following:

   - add LIBDIR to the `LD_LIBRARY_PATH‘ environment variable

     during execution

   - add LIBDIR to the `LD_RUN_PATH‘ environment variable

     during linking

   - use the `-Wl,-rpath -Wl,LIBDIR‘ linker flag

   - have your system
administrator add LIBDIR to `/etc/ld.so.conf‘

See any operating system
documentation about shared libraries for

more information, such as the ld(1) and ld.so(8) manual pages.

  这就是告诉你,库文件安装到了/usr/local/lib文件夹里。可是当我编译链接下面的代码时,却发生了错误:


#include <ev.h>
#include <stdio.h>

ev_io stdin_watcher;
ev_timer timeout_watcher;

static void stdin_cb(EV_P_ ev_io *w,int revents)
{
puts ("stdin ready");
ev_io_stop(EV_A_ w);
ev_break (EV_A_ EVBREAK_ALL);
}

static void timeout_cb (EV_P_ ev_timer *w,int revents)
{
puts ("timeout");
ev_break( EV_A_ EVBREAK_ONE );
}

int main(int argc,char* argv[])
{
struct ev_loop *loop = EV_DEFAULT;

ev_io_init(&stdin_watcher,stdin_cb,0,EV_READ);
ev_io_start (loop,&stdin_watcher);

ev_timer_init (&timeout_watcher,timeout_cb,5.5,0); // in document the last is 0. not 0,I don‘t know why yet
ev_timer_start (loop,&timeout_watcher);

ev_run (loop,0);

return 0;
}

output:
[email protected]:/home/xzc/cpp/test# gcc -o libev_hello libev_hello.c
/tmp/ccNN2QkE.o: In function `stdin_cb‘:
libev_hello.c:(.text+0x20): undefined reference to `ev_io_stop‘
libev_hello.c:(.text+0x33): undefined reference to `ev_break‘
/tmp/ccNN2QkE.o: In function `timeout_cb‘:
libev_hello.c:(.text+0x5a): undefined reference to `ev_break‘
/tmp/ccNN2QkE.o: In function `main‘:
libev_hello.c:(.text+0x71): undefined reference to `ev_default_loop‘
libev_hello.c:(.text+0xc9): undefined reference to `ev_io_start‘
libev_hello.c:(.text+0x11f): undefined reference to `ev_timer_start‘
libev_hello.c:(.text+0x133): undefined reference to `ev_run‘
collect2: ld returned 1 exit status

正确的编译方法为gcc -o libev_hello libev_hello.c -lev,为什么要加-lev呢,参考gcc参数-llibrary,即需要指定ev库(就是libev)。这里我有点不明白,为什么我指定了头文件#include<ev.h>,链接时gcc没有自动去查找库libev.o,这个库已经被安装到/usr/local/lib里了。并且,我指定ev库,gcc怎么知道去哪个.o文件查找,难道根据名字,ev就是libev.o,如果是test,那就是libtest.o么。好吧,在没有找到答案之前,我就这样认为。

时间: 2024-10-11 13:25:11

分析linux下的编译环境的相关文章

FFmpeg在Linux下安装编译过程

转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下安装编译过程,用的是CentOS, 总体过程比较顺利,就是在ffmpeg等的时间稍长点.没什么技术难点.仅当记录. 关于FFmpeg FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包

linux 下安装编译配置 QT

打算做嵌入式图像处理,计划方案嵌入式Linux+OpenCV+QT,昨天简单入门OpenCV今天看看QT,QT就先弄Linux下面的,回家之前争取把基本的摸通,然后能在板子上跑起来. 软件环境 Linux:Ubuntu 12.04 X86 QT:4.8.4 关于QT安装 QT的早期版本和现在版本有点变化,提供的文件也不尽相同,最新的版本为5.0,我这里用的是4.8.4,一个完整的QT应该包括QT库.IDE也就是QT creator,在Linux下的安装中,目前看到的主要有三种方法: 1..bin

Linux下各种常见环境变量的配置

Linux系统下各种环境变量都通过修改/etc/profile文件来实现.由于是系统文件,修改此文件需要root权限.因此实现以下功能都需要用户拥有root权限. 另:不要轻易修改profile文件中的现有内容.应在保证原有内容不变的前提下,在文件的最后插入新的一行. 1.路径变量PATH 当用户在某工作目录执行一个命令或者可执行程序时,若当前路径下不存在该程序,则系统将从PATH路径列表中查找指定的应用程序.还记得java命令,ping命令么?这些应用程序所在的文件夹都包含在了PATH路径中.

Linux下nginx编译安装教程和编译参数详解

这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # yum install pcre* //如过你已经装了,请跳过这一步 2.安装openssl 需要ssl的支持,如果不需要ssl支持,请跳过这一步 复制代码代码如下: # yum install openssl* 3.gzip 类库安装 复制代码代码如下: yum install zlib zlib-

Java学习心得之 Linux下搭建JavaWeb环境

1. 前言2. Java安装3. tomcat安装4. tomcat简单命令 一.前言 本篇博文记录了Linux下JavaWeb环境的搭建,本文内容基于以下文章: http://m.blog.csdn.net/article/details?id=7727927(ubuntu下搭建java web开发环境的详细步骤)http://blog.csdn.net/xiaoyao6650/article/details/4029946 (用Ant编译Java Web程序) 关于JavaWeb的学习资料h

linux下c++开发环境安装(eclipse+cdt)

方法一: 此外,众所周知,Eclipse是Java程序,因此很容易就实现了跨平台,也是众所周知,Java的大型程序非常吃内存,即使有512MB内存, 仍然感觉Eclipse的启动速度很慢.个人认为1GB内存是你工作效率的保证.其余的东西,需待我深入学习以后再进一步分析. 据网友的经验,先安装Eclipse Classic,然后再装CDT(C/C++ Development Tool),这样虽然体积大了一点但是方便日后添加Tool Kit. 在Ubuntu上安装Eclipse有两种方法:1. 使用

Linux下gcc编译控制动态库导出函数小结

Linux下gcc编译控制动态库导出函数小结 来源 https://www.cnblogs.com/lidabo/p/5703890.html 根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden"))) 就是说将不公开的函数都加上这个属性,没加的就是可见的 2. gcc 在链接时设置 -fvisibility=hidden,则不加 v

Linux 下面java编译环境相关笔记

1.如果自己编写的java文件依赖于很多第三方库(比如adir1和dir2下面都有很多jar包),加入自己的文件名叫foo.java那么可以用如下指令编译 javac -Djava.ext.dirs=dir1;dir2 foo.java 2.打包一个可执行的jar包的过程 a.写一个完整的java文件HelloWorld.java b.执行命令:javac HelloWorld.java生成HelloWorld.class c.执行命令 jar cvf HelloWorld.jar HelloW

在linux下如何编译C++程序

一.GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活.它可以通过不同的前端模块来支持各种语言,如Java.Fortran.Pascal.Modula-3和Ada g++是GCC中的一个工具,专门来编译C++语言的. GCC的参数有:( 也是分步实现) -E  让GCC在预处理结束后停止编译  g++ -E hello.cpp  -o  hello.i -c  将hello.i编译成目标代码 g++  -c  hello