編集:回答に応じて、行った変更で質問を更新しました。
私が書いた小さなライブラリにリンクしようとしていますが、これはC ++で行われていることを学ぶために書いたものです。G++ は と不平を言っていundefined reference
ます。
リンクしたいライブラリのルートディレクトリは directory にあり~/code/gklib/cxx/
ます。このディレクトリの構造は次のとおりです。
~/code/gklib/cxx/
|
|`-> gk.{hh,cc}
|`-> libgk.o
|
`-> lib/
|
`-> libgk.a
flagを使用してコンパイルgk.cc
し-c
、結果のオブジェクト ファイルを.aファイルに変換しましたar rvsc lib/libgk.a libgk.o
。
このライブラリのクライアントは folder にあります~/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)
コマンドで多くのバリエーションを試しましたが、結果はありませんでした。インターネットには、私にとってはうまくいかなかった指示が記載されたチュートリアルやフォーラムがたくさんあります。このコードは、すべてが 1 つのファイルにあるときに完全に実行されました。この問題を解決するにはどうすればよいですか? 前もって感謝します。