我有以下文件和代码:

test.hpp:

#include <iostream>
#include <string>
#include "utils.hpp"

class test
{
public:
    void func();

    template<typename T>
    void tfunc(T t);
};

template<typename T>
void test::tfunc(T t)
{
    std::cout << "tfunc(): " << t << std::endl;
    utils::ufunc();
}

test.cpp:
#include "utils.hpp"
#include "test.hpp"

void test::func()
{
    std::cout << "func" << std::endl;
    utils::ufunc();
}

utils.hpp:
#include <iostream>

namespace utils
{
#ifdef __cplusplus
extern "C"
{
#endif

void ufunc();

#ifdef __cplusplus
}
#endif
}

utils.cpp:
#include <iostream>
#include "utils.hpp"

using namespace utils;

void ufunc()
{
    std::cout << "ufunc" << std::endl;
}

main.cpp:
#include <iostream>
#include "test.hpp"

int main()
{
    test t;

    t.func();
    t.tfunc(10);
}

我使用以下命令从test.cpp和utils.cpp编译并生成lib:
g++ -c test.cpp utils.cpp
ar -cvq test.a test.o utils.o

然后,我建立了main.cpp并尝试链接它:
g++ -c main.cpp -o main.o
g++ main.o test.a

但是,我收到了链接错误:对ufunc的 undefined reference

我在utils.hpp中添加了extern“C”,但是仍然出现链接错误。试图在stackoverflow中搜索相同的问题,但找不到。

最佳答案

在utils.cpp中定义void ufunc()时,是在全局 namespace 中定义它。

您应该将其定义为void utils::ufunc(),否则,永远不会定义您在utils.hpp中声明的void utils::ufunc()

关于c++ - 链接静态库时 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46246979/

10-14 19:12