我的解决方案(针对 Raspbian Buster)的 makefile 包含LDFLAGS
如下定义:
LDFLAGS=-L/usr/lib -L/usr/lib/arm-linux-gnueabihf
…以便标准 libdir 优先于特定于平台的 libdir。不幸的是,我在使用 中的一个库时遇到了一些麻烦/usr/lib
,由于过时的 C++ ABI,无法链接该库。然而,当我交换目录时,一切正常:
LDFLAGS=-L/usr/lib/arm-linux-gnueabihf -L/usr/lib
通常最好在通用之前声明平台相关的 libdirs 吗/usr/lib
?谢谢。
更新:相应的配方相当标准,内容如下:
$(EXEC) : $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o $(EXEC) $(LDFLAGS) $(LIBRARIES)
$(OBJECTS) : $(SRC)
$(CC) $(CFLAGS) -c $(SRC)
答案1
使用LDFLAGS
是最后的手段。如果您在 makefile 中使用它,这是使您的软件不可移植的好方法。
最好编写直接使用所需ld
命令行的 Makefile。
例如,您可以使用命令行,例如:
$(CC) $(CFLAGS) $(OBJECTS) -o $@ $(LDPATH:%=-L%) $(LIBRARIES)
并将库搜索的搜索目录列表放入LDPATH
.
请注意,用于的模式匹配宏扩展LDPATH
不是 POSIXmake
规范的一部分,但此功能已由 SunPro Make 于 1986 年引入,并被许多 make 实现复制,呃smake
,gnu make
。如果您有旧版本make
,则需要-Lpath
在命令行中手动使用每个库搜索目录的条目。