如何使用g ++在另一个文件中定义的函数?

时间:2014-08-29 17:05:07

标签: c++ linker g++

这是一个非常基本的问题,我在网上找到了很多概念性的答案,但却未能真正发挥作用。

这就是我所拥有的:

file source.cc

#include <iostream>

int myfunc() {
  return 42;
}

int main() {
  return 0;
}

然后我通过:

创建一个目标文件source.o
g++ -c source.cc

最后,我使用

ar rvs source.a source.o

获取source.a静态库。

现在,麻烦来了。

文件user.cc如下所示:

#include <iostream>
#include <source.a>

int main() {
  std::cout << myfunc();
}

我显然想要使用库中定义的函数,但在尝试编译user.cc时:

g++ user.cc -o user

我得到的错误是:

user.cc:2:22: fatal error: source.a: No such file or directory
compilation terminated.

7 个答案:

答案 0 :(得分:3)

#include是编译时间,必须是C / C ++标题(不是库),包含例如

extern int myfunc();

比你必须使用链接器编译所有togehter(指定命令行上所需的所有文件)

答案 1 :(得分:2)

不要#include图书馆档案。它不包含源代码。它包含目标代码。将它放在链接器的命令行上。

g++ -c user.cc汇编。 与g++ -o user user.o source.a链接。

答案 2 :(得分:2)

在C ++(和C99)中,您调用的每个函数都要提前声明。为此,您需要提供&#34;签名&#34;功能,没有定义。在您的情况下,这将是声明

int myfunc();

告诉编译器myfunc是一个不带参数并返回int的函数。通常,您会在标题中包含此函数声明。

.a文件是一个不包含C或C ++代码的已编译存档,因此#include将其放入C ++文件将无法正常工作。相反,您需要创建C或C ++标头,并将.a存档添加到要链接到最终可执行文件的文件列表中。使用g ++,这很容易,你可以说

g++ user.cc source.a -o executable

例如。

答案 3 :(得分:2)

除了其他人已经在命令行上正确使用g ++的语法上写的内容之外,您可能还需要考虑代码组织上的以下注释。

库代码中,您应该定义main()功能。 main()的定义应该是使用您的库的代码的一部分,即示例中的文件user.cc

此外,您可能希望向库的客户端分发头文件,他们可以使用这些文件导入库导出的函数的声明

所以,考虑定义一些这样的文件:

标题文件:

// library.h -- Public header for your library's clients

#pragma once   // or use #ifndef/#define/#endif "header guards"

// Functions exported by your library: 
// their *declarations* go in the library's public header file;
// their *definitions* go in the library's implementation file(s) (.cc, .cpp)
// (exception: inline functions/methods, that are implemented in headers).

int myfunc();

// Add some other exported functions...

// NOTE: "extern" not needed in C++!

实施文件:

// library.cc -- Library implementation code
#include "library.h" // library public header 
#include <...>       // headers required by this implementation code

// *Define* functions exported by the library

int myfunc() {
    return 42;
}

// ...other function implementations...

然后,图书馆的客户只会这样做:

包含main()并使用您的资料库的文件:

// main.cc (or user.cc or whatever you call it)

#include <iostream>   // For std::cout, std::endl
...#include any other required header file...

#include "library.h"  // Your library public header file

int main() {
    // Call library's function
    std::cout << myfunc() << std::endl;
}    

// NOTE: main() is special: "return 0;" can be omitted.

答案 4 :(得分:0)

默认情况下,#include <...>构造(带尖括号)搜索系统目录以查找指定的文件。要搜索其他目录,可以使用-L选项,要链接库,需要在命令行中使用source.a。像这样:

g++ user.cc -L/path/to/library source.a -o user

答案 5 :(得分:0)

添加到讨论中的一些想法 1)您应该创建一个名为source.h的头文件,其中包含行

int myfunc(); 要么, extern int myfunc();

2)在顶部的user.cc中应该是一行   包括&#34; source.h&#34; 这将告诉编译器函数已定义

3)我认为你应该从source.cc中取出main函数,或者至少使它成为静态

正如其他人所指出的那样,你不能包含一个库文件(source.a) 你的编译和链接过程应该按原样运行。

答案 6 :(得分:0)

您可以使用#include使用十字架文件。如果要使用库,则必须告诉链接器在哪里查找库文件。

检查这些文章中的静态和动态库:

Static and dynamic libraries

Using libraries in VS2005

Using libraries in Code::Blocks