使用Makefile和gcc构建动态共享库(.so、.dylib)
我想用Makefile gcc构建共享库(使用Makefile和gcc构建动态共享库(.so、.dylib),c,gcc,makefile,C,Gcc,Makefile,我想用Makefile gcc构建共享库(.so.dylib)。 我的库有来自其他共享库(编译到共享库的其他C项目)的引用(符号) 我有这样的目录结构: /c/ /Project1/... /Project2/... ... /unit_tests/... /comparers/... 在我的/comparers目录中,我有这样的目录结构: 为了编译依赖于比较器共享库的单元测试共享库,我尝试了如下方法: $(SHARED_LIBRARY): assertion.o
.so.dylib)
。
我的库有来自其他共享库(编译到共享库的其他C项目)的引用(符号)
我有这样的目录结构:
/c/
/Project1/...
/Project2/...
...
/unit_tests/...
/comparers/...
在我的/comparers
目录中,我有这样的目录结构:为了编译依赖于比较器共享库的单元测试共享库,我尝试了如下方法:
$(SHARED_LIBRARY): assertion.o
$(CC) $(CFLAGS) -shared -o $(OUTPUT_LIB_DIR)/$(SHARED_LIBRARY) $(OUTPUT_DIR)/assertion.o $(COMPARERS_SHARED_LIB_PATH)
其中:
COMPARERS_SHARED_LIB_PATH= ../comparers/output/debug/lib/libcomparers.so
但如果我使用静态库路径,它将无法正常编译。为什么这不起作用,以及如何使其正常工作
更新:错误消息
上面是正确构建的,但我假设它在运行时会导致错误!当我以同样的方式链接我的可执行目标时,它也会生成,但在运行时,它会给出这样的错误消息:
dyld: Library not loaded: output/debug/lib/libcomparers.so
Referenced from: /Users/michzio/Developer/MyProjects/BachelorDegree/c/unit_tests/./output/debug/bin/unit_tests
Reason: image not found
Abort trap: 6
尽管您没有发布错误消息,但仍有一些错误是显而易见的 一个错误是,您混合和匹配带有路径和不带路径的文件名。例如,
$(共享库)
不同于$(输出库)/$(共享库)
和断言。o
不同于$(输出库)/assertion.o
。你需要学会如何使用它来防止这种错误
另一个错误是链接到另一个共享库的方式:运行时链接器搜索。/comparers/output/debug/lib/libcomparers。因此
,并且该路径仅在当前目录特定时有效
而链接通常使用LDFLAGS
,而不是CFLAGS
一个解决方案可能是:
COMPARERS_SHARED_LIB_PATH := $(abspath ../comparers/output/debug/lib/libcomparers.so)
$(OUTPUT_LIB_DIR)/(SHARED_LIBRARY): $(OUTPUT_DIR)/assertion.o $(COMPARERS_SHARED_LIB_PATH)
$(CC) -shared -o $@ $(LDFLAGS) $^
但是,对于生产构建,它需要使用
$ORIGIN
相对路径为其他共享库指定-rpath
,以便运行时链接器相对于其用户查找所需的共享库。并使用-L-L
而不是完整路径链接到该共享库。“它不工作”?不是很有帮助…逐字张贴错误消息。