2017-06-06 90 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>而不是完整路徑鏈接到該共享庫。