这是一个非常基本的问题,我在网上找到了很多概念性的答案,但却未能真正发挥作用。
这就是我所拥有的:
file source.cc
#include <iostream>
int myfunc() {
return 42;
}
int main() {
return 0;
}
然后我通过:
创建一个目标文件source.og++ -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.
答案 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
使用十字架文件。如果要使用库,则必须告诉链接器在哪里查找库文件。
检查这些文章中的静态和动态库: