2016-05-04 24 views
-1

1つのC静的ライブラリに結合したい2つの情報源があります。Cで静的ライブラリを構築する

renderay_core.c 
renderay_shapes.c 

とそれに対応するヘッダーファイル。私はこれを最初にエラーを避けるためにスタンドアロン(非ライブラリ)としてコンパイルしました。

test.cのは

#include <stdio.h> 
#include "renderay_core.c" 
#include "renderay_shapes.c" 

int main(void){ 
    Canvas* canvas = new_Canvas(5,5); 
    printf("Test"); 
} 

でそれをコンパイル:

gcc test.c renderay_core.c renderay_shapes.c -o main.exe 

、それがうまく働きました。

今私はこれを静的なlibにパックしています。それ以降の作業:

gcc -c renderay_core.c renderay_shapes.c 

ここでは、オブジェクトをライブラリとしてリンクする準備が整いました。

ar rcs librenderay.a renderay_core.c renderay_shapes.c 

これは私が使用するコマンドです。次に、プレーンなソースファイルの代わりにライブラリを使ってtest.cをコンパイルしようとします。

「new_Canvas」ライブラリへのリンクが失敗したことを私に言って

への未定義参照:私はこれをコンパイルしようとすると

gcc test.c -o main.exe -static -L -lrenderay 

は、今私は、エラー警告が表示されます。私はここで間違って何をしていますか?私は何を逃したのですか?

+0

ヘッダーファイルについて学びます。実装ファイルを含めないでください。 – Olaf

+0

オブジェクトファイルではなくCソースファイルに対して 'ar'を実行しているようです。 –

答えて

2

コンパイル - リンクなし - ソースファイル

gcc -c renderay_core.c -o renderay_core.o 
gcc -c renderay_shapes.c -o renderay_shapes.o 

次にあなたが標準以外の場所を指定するLが必要

gcc test.c -o main.exe -static -L. -lrenderay 

を使用して、それに

ar -rcs librenderay.a renderay_core.o renderay_shapes.o 

そしてリンクそれを詰めます - 現在のディレクトリ。

+0

ああ私はaを参照してください。問題を引き起こした-L mybeの後に... – xetra11

+0

はい、リンカを現在のディレクトリに向けるにはピリオド( '.')が必要です。 – sjsam

+0

ありがとうございました – xetra11

0

問題は、ソースファイルをリンクするが、それはその

ar rcs librenderay.a renderay_core.o renderay_shapes.o 

P.S.のようなものでなければならないファイル

ar rcs librenderay.a renderay_core.c renderay_shapes.c 

オブジェクトされていないということですMakefileでこれを行うことができます

CFLAGS = -O2 -Wall -fPIC 
OBJS = renderay_core.o renderay_shapes.o 

.c.o: 
    $(CC) $(CFLAGS) -c $< 

librenderay.a: $(OBJS) 
    $(AR) rcs librenderay.a $(OBJS) 

.PHONY: clean 
clean: 
    $(RM) librenderay.a $(OBJS) 
+0

オハイオ州オハイオ州オタクのタイプミス。ありがとう、相棒 – xetra11