链接C+时出现编译错误+;类(.cpp和.h)文件,该文件具有;“全球”;在其中发挥作用 我对C++中的所有库(静态和共享)都是新的,我会提前告诉大家,我所面临的问题是在我所做的一些“教育”的事情中,所以,如果它没有意义的话(这样),我就不知道。 我正在做: Ubuntu 16.04 g++(Ubuntu 5.4.0-6ubuntu1~16.04.9)5.4.0 20160609
我的“项目”有以下文件(为了简单起见,它们都位于同一个文件夹中)链接C+时出现编译错误+;类(.cpp和.h)文件,该文件具有;“全球”;在其中发挥作用 我对C++中的所有库(静态和共享)都是新的,我会提前告诉大家,我所面临的问题是在我所做的一些“教育”的事情中,所以,如果它没有意义的话(这样),我就不知道。 我正在做: Ubuntu 16.04 g++(Ubuntu 5.4.0-6ubuntu1~16.04.9)5.4.0 20160609,c++,linux,compiler-errors,g++,static-libraries,C++,Linux,Compiler Errors,G++,Static Libraries,我的“项目”有以下文件(为了简单起见,它们都位于同一个文件夹中) 两个C++类,从中我希望创建一个静态库( Calas.H./Cube >, CalpA.CPP, C> BASE.H./C>和 Cabr.BCP.CP/李> 将链接到静态库的单个“可执行”文件main.cpp 在每个类文件(classA和classB)中,我都添加了(除了类的函数之外)一个“全局”函数——同样,出于教育目的 为了创建静态库,然后创建将使用它的可执行文件,我将执行以下步骤: 1) 将两个类的源文件编译成目标文件:
- 两个C++类,从中我希望创建一个静态库(<代码> Calas.H./Cube >,<代码> CalpA.CPP,
C> BASE.H./C>和 Cabr.BCP.CP/<代码>李> - 将链接到静态库的单个“可执行”文件
main.cpp
- 将链接到静态库的单个“可执行”文件
g++-Wall-c classA.cpp classB.cpp
2) 从以下两个对象文件创建一个名为myStaticLib.a
的静态库:
ar-cvq myStaticLib.a classA.o classB.o
到目前为止还不错
3) 将main.cpp
文件编译为链接到静态库的可执行文件(myExe
):
g++-o myExe main.cpp myStaticLib.a
-->这里我面临一个编译错误,如下所示:
main.cpp:在函数“int main(int,char**)”中:
main.cpp:27:19:错误:“funcFromASrcFile”未在此作用域中声明
funcFromASrcFile()
为了解决这个问题,我在main.cpp
文件中添加了以下行:
void funcFromASrcFile();
void funcFromBSrcFile()代码>
这是每个.cpp文件中“全局”函数的签名(分别作为其名称状态)
这个解决方案“解决”了我的编译问题,当我运行可执行文件时,它可以正常工作
以下是我的问题:
- 1) 这是解决这个问题的正确和理想的方法吗?若然,原因为何
- 2) 当我删除上面提到的两行时(
void funcFromASrcFile();
void funcFromBSrcFile();
)-我得到了编译错误,但是,当我只保留第一个(void funcFromBSrcFile();
)时,它再次编译并运行良好。为什么呢
- 3) 当然,如果我还遗漏了什么,请详细说明李>
每个文件中的代码如下所示:
classA.h
classA.cpp
#include <iostream>
#include "classA.h"
using namespace std;
void funcFromASrcFile()
{
cout << "funcFromASrcFile" << endl;
}
A::A()
{
cout << "A::A" << endl;
}
A::~A()
{
cout << "A::~A" << endl;
}
void A::FooA() const
{
cout << "A::Foo" << endl;
}
#include <iostream>
#include "classB.h"
using namespace std;
void funcFromBSrcFile()
{
cout << "funcFromBSrcFile" << endl;
}
B::B()
{
cout << "B::B" << endl;
}
B::~B()
{
cout << "B::~B" << endl;
}
void B::FooB() const
{
cout << "B::Foo" << endl;
}
classB.cpp
#include <iostream>
#include "classA.h"
using namespace std;
void funcFromASrcFile()
{
cout << "funcFromASrcFile" << endl;
}
A::A()
{
cout << "A::A" << endl;
}
A::~A()
{
cout << "A::~A" << endl;
}
void A::FooA() const
{
cout << "A::Foo" << endl;
}
#include <iostream>
#include "classB.h"
using namespace std;
void funcFromBSrcFile()
{
cout << "funcFromBSrcFile" << endl;
}
B::B()
{
cout << "B::B" << endl;
}
B::~B()
{
cout << "B::~B" << endl;
}
void B::FooB() const
{
cout << "B::Foo" << endl;
}
#包括
#包括“B.h类”
使用名称空间std;
void funcFromBSrcFile()
{
无法在上或两者中复制。可能您的计算机有问题。请尝试更新您的g++(如果有人想阅读),使用g++-Wall-Wextra-H-g
;使用一些声明全局名称的头文件,并在那里定义extern void funcFromASrcFile();
(或者把它放在名称不正确的classA.h
)顺便说一句,也可以从
#include <iostream>
#include <string>
#include "classA.h"
#include "classB.h"
void funcFromASrcFile();
void funcFromBSrcFile();
using namespace std;
int main(int , char**)
{
cout << "main - start" << endl;
cout << "main - creating an A object on the stack" << endl;
A a;
a.FooA();
funcFromASrcFile();
cout << "main - creating an B object on the stack" << endl;
B b;
b.FooB();
funcFromBSrcFile();
return 0;
}