链接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
在每个类文件(classA和classB)中,我都添加了(除了类的函数之外)一个“全局”函数——同样,出于教育目的

为了创建静态库,然后创建将使用它的可执行文件,我将执行以下步骤:

1) 将两个类的源文件编译成目标文件:
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;
}