使用 Linux g++ 编译带有附加库的 c++ 程序
Posted
技术标签:
【中文标题】使用 Linux g++ 编译带有附加库的 c++ 程序【英文标题】:Compiling c++ program with additional libraries using Linux g++ 【发布时间】:2014-03-04 22:52:56 【问题描述】:我使用 Visual Studio 2010 创建了一个程序,该程序没有错误。但是,当我尝试在 Linux 中使用 g++ 编译器运行它时,我遇到了一些关于未知函数的错误,这应该是已知的。
我有以下文件:
main.cpp
header.h
header.cpp (all in the same folder)
header2.h (which is in a different folder, /.../header2
各种库,存储在另一个文件夹 /.../libs
为了编译代码,我使用 g++ 编译器,在终端中编写以下代码:
g++ main.cpp header.cpp -I/.../header2 -L/.../libs
我读过 -I 前缀指定包含头文件的包含目录,而 -L 前缀指定库目录。
当我编译程序时出现错误,无法识别 time.h 库中的函数。我检查了是否安装了标头,使用 查找 /usr/include -name time.h 它返回了 time.h 标头的位置。我也试过用-lrt编译,但是没有用 g++ main.cpp header.cpp -I/.../header2 -L/.../libs -lrt
我对 linux 很陌生,所以任何帮助都将不胜感激。
谢谢。
编辑: 我得到的实际错误是:
ellipse_fit.cpp: In function ‘void Create_Permutation(int*, int, int)’:
ellipse_fit.cpp:53:29: error: ‘rand’ was not declared in this scope
a[i] = (int)((double)rand()/RAND_MAX*(double)range);
ellipse_fit.cpp:53:31: error: ‘RAND_MAX’ was not declared in this scope
a[i] = (int)((double)rand()/RAND_MAX*(double)range);
ellipse_fit.cpp 相当于我在示例中提到的 header.cpp。
【问题讨论】:
听起来您实际上并没有在任何地方包含time.h
- 通常情况下,某些系统标头“拖入其他系统”,在一个系统中,但在您在另一个环境中编译时不会。它会帮助你们中的很多人制作一个您所看到的最小示例,带有真实的路径和真实的头文件。
编辑了我在原帖中得到的实际错误!
那么,重现这个的代码是什么样的?你包括stdlib.h
或cstdlib
吗?
我尝试在一个简单的测试用例中重现您的问题,使用#include <cstdlib>
和#include <stdlib.h>
,均未失败。
我没有包括那些库!我现在把它们包括在内,它起作用了。为什么它在没有这些包含的情况下在 windows 中工作,但在 linux 中却不行?
【参考方案1】:
当一个系统中的#include "something.h"
包含您在代码中依赖的标头,而当您移动到另一个目标系统时,“something.h”不包含该特定标头(Windows sources 也有一个非常烦人的习惯,即包含“stdafx.h”,它又包含一些你没有想到的头文件)。
解决方案是在源文件中包含提供所需功能的头文件。假设头文件正确地使用了包含保护,如果你额外包含同一个文件几次,就不会发生什么坏事。即使是相当复杂的头文件也几乎不需要时间(我做了一个实验作为这里的一个问题的结果,表明当你“不必要地”在 30 个源文件中包含一个相当大的头文件时,它会增加几毫秒到几秒的编译时间 - 现代编译器甚至会缓存头文件,所以如果你两次包含相同的头文件,它就知道它已经看到了,并且知道它是否包含包含防护,以及是否需要再次接收它,甚至不需要读取文件)。
【讨论】:
以上是关于使用 Linux g++ 编译带有附加库的 c++ 程序的主要内容,如果未能解决你的问题,请参考以下文章
linux下,有几个.so。如何将这几个动态库编译成一个动态库