如何在 makefile 中添加 .c、.cc 和 .so 文件以创建另一个 .so?

Posted

技术标签:

【中文标题】如何在 makefile 中添加 .c、.cc 和 .so 文件以创建另一个 .so?【英文标题】:how to add .c, .cc and .so file in makefile to create another .so? 【发布时间】:2018-02-18 17:10:03 【问题描述】:

我想在 C 中使用 C++ 库,这就是为什么我为 C 编写了一个包装器,其中包含一个 wr.h、wr.cc 和一个测试程序 test.c。因此,我编写了一个 makefile(如下所示)来为我的包装器创建一个 .so 文件。但它显示了对库的未定义引用。有什么建议吗?

PROGRAM = MYWR

INCLUDEDIRS = -I/path/to/include
LIBDIRS = -L/path/to/lib/

LIBS = -labc -lbcd

CXXSOURCES = wr.cc
CSOURCES = test.c
CXXOBJECTS = $(CXXSOURCES:.cc=.o)
COBJECTS = $(CSOURCES:.c=.o)

CXXFLAGS = -g -Wall -std=gnu++11 $(INCLUDEDIRS)
CXX = g++

LDFLAGS = $(LIBDIRS) $(LIBS)

all: $(PROGRAM)

$(PROGRAM): $(CXXOBJECTS) $(COBJECTS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(CXXOBJECTS) $(COBJECTS)

有什么建议吗???

【问题讨论】:

【参考方案1】:

-lxxx 移动到命令行末尾?有时顺序确实很重要:

$(CXX) $(CXXFLAGS) -o $@ $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) 

【讨论】:

感谢它有效。那我需要添加哪些行来制作 .so 文件?它会创建唯一的可执行文件。 它应该是$(CXX) -shared -o $@ ...,但我很确定在大多数平台上它在您的新 .so 中包含 .so 代码。 IE。您仍然需要另一个 .so 才能运行您的 C 代码。 但它显示重定位R_X86_64_32 对`.rodata' 不能在制作共享对象时使用;使用 -fPIC 重新编译。猜猜为什么? 进入动态库的所有代码都需要与位置无关。你确定有CXXFLAGS = -fPIC CFLAGS = -fPIC吗?由于您的 makefile 没有为 .cpp/.c -> .o 定义规则,因此将使用默认规则。这意味着 test.c 是用$(CC) $(CFLAGS) 编译的。也可能是您的 .cpp 代码,这意味着它也可能看不到 $(CXXFLAGS) 根据我的经验,我建议为 .o 生成添加明确的规则,而不是依赖默认规则。例如。 $(COBJECTS): *.o: *.c $(CC) $(CFLAGS) -o $@ -c $<

以上是关于如何在 makefile 中添加 .c、.cc 和 .so 文件以创建另一个 .so?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置我的 makefile 以进行调试和发布版本?

如何在 c c++ 混合生成文件中为 c 对象添加附加规则?

makefile 文件模板

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法

UNIX下 用CC如何编译多个c语言源程序文件

makefile编写规则