2017-02-15 172 views
0

如何使用-l标志编译我的makefile?使用-l标志链接静态库

我有一个makefile,看起来像

myLibrary: 
    gcc -c myLibrary.c -o myLibrary.o 
    ar cr libmyLibrary.a myLibrary.o 

,然后我编译我的主要程序与

main: 
    gcc -g -c -o main.o main.c 
    gcc main.o -o main libmyLibrary.a 

以上的Makefile作品,但如果我想更换

libmyLibrary.a 

-lmyLibrary我收到一个错误。不应该一样工作吗?

+2

您需要添加-L选项以设置要找到您的库的目录。链接器不会在当前目录中查找使用-l指定的库。如果你所有的构建发生在一个目录中,'-L.'应该可以正常工作。 –

回答

1

这是一个基本的,不切实际的makefile文件,这将使静态库libmyLibary 它使程序main,它将与静态库 使用-L(库搜索路径)和-l(库)选项链接之前。

的Makefile

.PHONY: all clean 

all: libmyLibrary.a main 

main: main.o | libmyLibrary.a 
    $(CC) -o main main.o -L. -lmyLibrary 

libmyLibrary.a: myLibrary.o 
    $(AR) rcs libmyLibrary.a myLibrary.o 

clean: 
    rm -f *.o libmyLibrary.a main 

它运行,如:

$ make 
cc -c -o myLibrary.o myLibrary.c 
ar rcs libmyLibrary.a myLibrary.o 
cc -c -o main.o main.c 
cc -o main main.o -L. -lmyLibrary 

当我想你知道,这是不现实的,使这两个图书馆和在相同的makefile与它连接的程序 ,因为一个库的点是 ,你不需要继续重建它以链接它与许多程序。你真的有 生成文件libmyLibrary.a和 使用它的程序的其他生成文件。

这是怎么gcc的链接选项-L-l工作:

-L/path/to/search 

告知链接查找您用-l选项/path/to/search指定, 任何库,它看起来对他们在其默认前搜索目录。当前目录., 不是链接器的默认搜索目录之一。所以,如果你想让它 找到当前目录下的-l选项指定库,那么你需要 指定-L.

-lfoo 

告知链接搜索任何一个动态库,libfoo.so,或静态 库,libfoo.a,首先在您的-L目录中,如果有的话,按照 指定的顺序,然后在其默认搜索目录中。如果在其中一个搜索目录中找到libfoo.solibfoo.a,它将立即停止搜索 。 如果它发现这两个他们在同一目录中,则默认情况下它会链接libfoo.so与 您的程序,而不是链接libfoo.a

+0

谢谢!我正在尝试使用-L,但直到我在它之后添加了一段时间之后才起作用 – FreeStyle4

1

要连结纯粹的静态库,使用-static,像

gcc -static main.c libmyLibrary.a 

并运行可执行文件./a.out GCC的Linux。

+0

我试图避免使用libmyLibrary.a来调用它,我必须使用-l标志来调用它 – FreeStyle4