如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 c c++ 混合生成文件中为 c 对象添加附加规则?