编辑:根据答案,我已经用我所做的更改更新了我的问题。
我正在尝试链接到我编写的一个小库,以了解这是用 C++ 完成的,但没有运气。G++ 抱怨undefined reference
.
我要链接的库的根目录在 directory 中~/code/gklib/cxx/
。该目录的结构如下:
~/code/gklib/cxx/
|
|`-> gk.{hh,cc}
|`-> libgk.o
|
`-> lib/
|
`-> libgk.a
我已经gk.cc
使用-c
标志编译,然后将生成的目标文件转换为带有.a 的.a文件ar rvsc lib/libgk.a libgk.o
。
该库的客户端位于文件夹~/code/cpp
。在此目录中,我再次编译some_stuff.cc
为目标文件,然后尝试使用以下命令链接到它:
$ cxx some_stuff.o -L../gklib/cxx/lib -lgk -o some_stuff
我收到此错误:
some_stuff.o: In function `main':
some_stuff.cc:(.text+0x49): undefined reference to `void GK::algorithms::insertionSort<int, 5ul>(int*)'
collect2: error: ld returned 1 exit status
这些是这些文件的内容:
~/code/cpp/some_stuff.cc
#include <cstdlib>
#include <iostream>
#include <gk.hh>
using namespace std;
int main(int argc, char **argv) {
int i = -1;
int arr[5] = { 3, 4, 2, 1, 5 };
const size_t len = sizeof(arr)/sizeof(int);
GK::algorithms::insertionSort<int, len>(arr);
while(++i < 5)
cout << arr[i] << " ";
cout << endl;
exit(EXIT_SUCCESS);
}
~/code/gklib/cxx/gk.cc
#include "gk.hh"
template<class T, size_t len>
void GK::algorithms::insertionSort(T arr[len]){
// insertion sort
}
~/code/gklib/cxx/gk.hh
#pragma once
#include <cstdlib>
#define NAMESPACE(ns) namespace ns {
#define END_NAMESPACE(ns) }
NAMESPACE(GK)
NAMESPACE(algorithms)
template<class T, size_t len>
extern void insertionSort(T arr[len]);
END_NAMESPACE(algorithms)
END_NAMESPACE(GK)
我对我的命令尝试了很多变体,但没有结果。互联网上到处都是教程和论坛,其中包含对我不起作用的说明。当所有的东西都在一个文件中时,这段代码运行得很好。我该如何解决这个问题?提前致谢。