我有以下文件和代码:
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/