我有以下文件和代码:
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中搜索相同的问题,但找不到。
答案 0 :(得分:1)
在utils.cpp中定义void ufunc()
时,您将在全局命名空间中定义它。
您应该将其定义为void utils::ufunc()
,否则,您在utils.hpp中声明的void utils::ufunc()
永远不会被定义。
答案 1 :(得分:0)
这可能是因为你的命名空间。您可以使用nm -C
查看对象(.o)和库(.a)文件中存在哪些符号。这样做,看看您是ufunc
还是utils::ufunc
。