スタティック ライブラリ (gcc でコンパイル) を C++ プログラムにリンクしようとしたところ、「未定義の参照」が発生しました。ubuntu 12.04 サーバー マシンで gcc および g++ バージョン 4.6.3 を使用しました。たとえば、階乗法の単純なライブラリ ファイルは次のとおりです。
mylib.h
#ifndef __MYLIB_H_
#define __MYLIB_H_
int factorial(int n);
#endif
mylib.c
#include "mylib.h"
int factorial(int n)
{
return ((n>=1)?(n*factorial(n-1)):1);
}
gcc を使用して、この mylib.c のオブジェクトを作成しました。
gcc -o mylib.o -c mylib.c
ここでも、AR ユーティリティを使用してオブジェクト ファイルから静的ライブラリが作成されました。
ar -cvq libfact.a mylib.o
このライブラリを C プログラム (test.c) と C++ プログラム (test.cpp) でテストしました。
C と C++ の両方のプログラムの本体は同じです。
#include "mylib.h"
int main()
{
int fact = factorial(5);
return 0;
}
静的ライブラリ libfact.a が /home/test ディレクトリで利用可能であると仮定して、問題なく C プログラムをコンパイルしました。
gcc test.c -L/home/test -lfact
ただし、C++ プログラムのテスト中に、リンク エラーがスローされました。
g++ test.cpp -L/home/test -lfact
test.cpp:(.text+0x2f): undefined reference to `factorial(int)'
collect2: ld returned 1 exit status
test.cpp に extern コマンドを追加してみました:
extern int factorial(int n) //added just before the main () function
それでも同じエラーです。
- 誰かが私がここで間違っていることを教えてもらえますか?
- 静的ライブラリの作成中に見逃したものはありますか?
- それを機能させるために何かを追加する
test.cpp
必要がありますか?