2011-11-24 186 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