链接静态库时未定义的引用

时间:2017-09-15 20:19:31

标签: c++

我有以下文件和代码:

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&#39;

我添加了extern&#34; C&#34;到utils.hpp,但仍然得到链接错误。试图在stackoverflow中搜索相同的问题,但找不到。

2 个答案:

答案 0 :(得分:1)

在utils.cpp中定义void ufunc()时,您将在全局命名空间中定义它。

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

答案 1 :(得分:0)

这可能是因为你的命名空间。您可以使用nm -C查看对象(.o)和库(.a)文件中存在哪些符号。这样做,看看您是ufunc还是utils::ufunc