4

正しくリンクされないCプロジェクトがありますが、これは--as-neededフラグがgccによってldプログラムに渡されたことが原因であると思われます。そのフラグのため、gccは、*。cファイルの前にオプションとしてリストされているリンクされたライブラリを不要と見なし、それらをリンクしません。


PREFIX?=/usr/local
CFLAGS=-D_LARGEFILE64_SOURCE=1 -g -Wall -I${PREFIX}/apr/include/apr-1  -I${PREFIX}/apr/include/apr-util-1
LDFLAGS=-lapr-1 -pthread -laprutil-1

all: devpkg
devpkg: bstrlib.o db.o shell.o commands.o 
install: all
    install -d $(DESTDIR)/$(PREFIX)/bin/
    install devpkg $(DESTDIR)/$(PREFIX)/bin/

clean:
    rm -f *.o
    rm -f devpkg
    rm -rf *.dSYM

このmakefileを実行すると、次のようになります。


cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1  -I/usr/local/apr/include/apr-util-1   -c -o bstrlib.o bstrlib.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1  -I/usr/local/apr/include/apr-util-1   -c -o db.o db.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1  -I/usr/local/apr/include/apr-util-1   -c -o shell.o shell.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1  -I/usr/local/apr/include/apr-util-1   -c -o commands.o commands.c
cc -D_LARGEFILE64_SOURCE=1 -g -Wall -I/usr/local/apr/include/apr-1  -I/usr/local/apr/include/apr-util-1  -lapr-1 -pthread -laprutil-1  devpkg.c bstrlib.o db.o shell.o commands.o   -o devpkg
/tmp/ccZcAm9b.o: In function `main':
/home/zach/Desktop/devpkgzed/devpkg.c:14: undefined reference to `apr_pool_initialize'
/home/zach/Desktop/devpkgzed/devpkg.c:15: undefined reference to `apr_pool_create_ex'
/home/zach/Desktop/devpkgzed/devpkg.c:29: undefined reference to `apr_getopt_init'
/home/zach/Desktop/devpkgzed/devpkg.c:31: undefined reference to `apr_getopt'

make私の問題は、設定されているCFLAGSを介してこれらのコマンドをどのように作成するのかがよくわからないことです。この問題を引き起こしている逆ではなく、リンカーオプションをコンパイル部分に従わせるにはどうすればよいですか?

4

1 に答える 1

8

Make には、ソース ファイルをコンパイルし、実行可能ファイルとライブラリをリンクするための組み込みの規則があります。リストするコマンドは、これらの規則によって生成されます。

これが失敗する理由は、リンク時にライブラリをオブジェクト ファイルの後にリストする必要があるためです。これは、リンカーがその引数を 1 回通過し、表示された時点で未解決でないシンボルを破棄するためです。これを修正するには、ライブラリをLDLIBS変数ではなく変数に入れます (つまり、単にでLDFLAGS置き換えます)。この変数は、またはなどのリンカの非ライブラリ オプション用です。LDFLAGSLDLIBSLDFLAGS-L-shared

于 2012-07-22T17:36:33.937 に答える