2017-06-06 91 views
-1

我想构建共享库(.so, .dylib) with Makefile gcc。 我的库有来自其他共享库的引用(符号)(编译为共享的其他C项目库)使用Makefile和gcc构建动态共享库(.so,.dylib)

我有这样的目录结构:

/c/ 
    /Project1/... 
    /Project2/... 
    ... 
    /unit_tests/... 
    /comparers/... 

里面我/comparers目录我有这样的目录结构:
enter image description here

我试图以编译unit_test依赖于共享库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 

但是,如果使用静态库它不工作而不是编译正确。为什么这不起作用以及如何使其正常工作?

UPDATE:错误信息

以上正确建立,但我认为它在运行时产生的错误!当我链接以同样的方式我可执行的目标也建立,但在运行时,它给出了这样的错误消息:

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 
+0

“它不起作用”?不是很有帮助... –

+0

逐字地发布错误消息。 –

回答

0

你虽然没有发布错误信息,还有一些是立刻显现了一些错误。

一个错误是,你混合和匹配文件名有和没有路径。例如。 $(SHARED_LIBRARY)$(OUTPUT_LIB_DIR)/$(SHARED_LIBRARY)不同,assertion.o$(OUTPUT_DIR)/assertion.o不同。你需要学习如何使用GNU make's automatic variables来防止这种错误。

另一个错误是,您链接到另一个共享库的方式:运行时链接程序搜索../comparers/output/debug/lib/libcomparers.so,并且只有当当前目录是特定的某个目录时,该路径才有效。

链接通常使用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 [email protected] $(LDFLAGS) $^ 

对于生产版本,虽然,它需要使用$ORIGIN相对路径来指定-rpath到其他共享库,从而使运行时链接发现相对于它的用户所需的共享库。然后使用-L<path> -l<lib>而不是完整路径链接到该共享库。