使用 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.hcstdlib吗? 我尝试在一个简单的测试用例中重现您的问题,使用#include <cstdlib>#include <stdlib.h>,均未失败。 我没有包括那些库!我现在把它们包括在内,它起作用了。为什么它在没有这些包含的情况下在 windows 中工作,但在 linux 中却不行? 【参考方案1】:

当一个系统中的#include "something.h" 包含您在代码中依赖的标头,而当您移动到另一个目标系统时,“something.h”不包含该特定标头(Windows sources 也有一个非常烦人的习惯,即包含“stdafx.h”,它又包含一些你没有想到的头文件)。

解决方案是在源文件中包含提供所需功能的头文件。假设头文件正确地使用了包含保护,如果你额外包含同一个文件几次,就不会发生什么坏事。即使是相当复杂的头文件也几乎不需要时间(我做了一个实验作为这里的一个问题的结果,表明当你“不必要地”在 30 个源文件中包含一个相当大的头文件时,它会增加几毫秒到几秒的编译时间 - 现代编译器甚至会缓存头文件,所以如果你两次包含相同的头文件,它就知道它已经看到了,并且知道它是否包含包含防护,以及是否需要再次接收它,甚至不需要读取文件)。

【讨论】:

以上是关于使用 Linux g++ 编译带有附加库的 c++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 cmake 编译带有 v8 库的 C++ 程序

linux下,有几个.so。如何将这几个动态库编译成一个动态库

g ++将库附加到应用程序

在 linux 中编译/链接多个 c++ 库

使用 gcc 和 g++ 分别编译带有 C 和 C++ 文件的项目?

Linux下C++静态库动态库的制作与使用