2011-11-24 110 views
3

我在Linux 64位上使用CMake時遇到問題。我在C中有一個示例,它必須鏈接到一個庫(xr_arp.a),該庫對另一個庫(libcrypto.a)具有鏈接依賴關係。我沒有建立我的示例代碼下面的Makefile成功鏈接:使用依賴於另一個庫的庫的CMake項目

CFLAGS = -I../Common -I../xr -I../../../openssl/include 
LIBS = ../xr/xr_arp.a ../../../openssl/lib/libcrypto.a 
TARGET = sample 
OBJFILES = sample.o 

all: $(TARGET) 

$(TARGET): Makefile $(OBJFILES) 
    $(CC) -o [email protected] $(OBJFILES) $(LIBS) 

clean: 
    rm -rf *.o $(TARGET) 

.SUFFIXES: .c .o 

.c.o: 
    $(CC) -Wall $(CFLAGS) -c $< 

不過,我想這個Makefile使用CMake的,而不是轉換。當我用下面的CMakeLists.txt文件,我得到xr_arp.c是未定義參考`SHA1' ,因爲它似乎是它不能xr_arp.a鏈接到libcrypto.a:

cmake_minimum_required(VERSION 2.8) 
project (SAMPLE C) 

set(CMAKE_C_FLAGS "-Wall") 

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR} 
    ${CMAKE_CURRENT_SOURCE_DIR}/../Common 
    ${CMAKE_CURRENT_SOURCE_DIR}/../xr 
) 

add_executable(
    sample 
    sample.c 
) 

target_link_libraries(
    sample 
    ${CMAKE_CURRENT_SOURCE_DIR}/../../../openssl/lib/libcrypto.a 
    ${CMAKE_CURRENT_SOURCE_DIR}/../xr/xr_arp.a 
) 

有人能指出我出去這兩個文件有什麼區別?爲什麼它和makefile一起工作,它不在CMake中?有沒有什麼程序可以用來強制xr_arp.a和libcrypto.a之間的鏈接?請注意,這兩個庫都是第三方的,不是我的。

回答

5

您是否嘗試過切換TARGET_LINK_LIBRARIES中指定庫的順序?在很多情況下,它不應該有所作爲,但我遇到了某些連接器的情況。我相信在Linux上的GNU鏈接器是一個有所作爲的例子。

我認爲xr_arp.a應該首先出現,以便鏈接程序知道在隨後的庫中查找SHA1。

如果不成功,請嘗試運行「make VERBOSE = 1」並將CMake生成的鏈接器命令與Makefile生成的鏈接器命令進行比較。

+0

謝謝你做到了! – thewalrusnp