Проект CMake использует библиотеку, которая зависит от другой библиотеки - PullRequest
3 голосов
/ 25 ноября 2011

У меня проблема с использованием CMake в Linux 64 bit.У меня есть пример на C, который должен ссылаться на библиотеку (xr_arp.a), которая имеет зависимость от ссылки на другую библиотеку (libcrypto.a).Следующий make-файл, который я сделал для создания моего примера кода, успешно связывается:

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 $@ $(OBJFILES) $(LIBS)

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

.SUFFIXES: .c .o

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

Однако я хотел бы преобразовать этот make-файл для использования 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
)

Может кто-то указатьменя в чем разница между этими двумя файлами?Почему он работает с make-файлом, а не с CMake?Есть ли какая-либо процедура, которую я мог бы использовать для принудительного связывания между xr_arp.a и libcrypto.a?Обратите внимание, что обе библиотеки являются сторонними и не моими.

1 Ответ

5 голосов
/ 25 ноября 2011

Вы пытались изменить порядок, в котором библиотеки указаны в TARGET_LINK_LIBRARIES? Во многих случаях это не должно иметь значения, но я сталкивался с случаями с определенными компоновщиками, где это происходит. Я считаю, что компоновщик GNU в Linux - один из тех случаев, когда он имеет значение.

Я думаю, что xr_arp.a должен появиться первым, чтобы компоновщик знал, что нужно искать SHA1 в библиотеках, которые следуют за ним.

В противном случае попробуйте запустить «make VERBOSE = 1» и сравнить команду компоновщика, сгенерированную CMake, с командой, сгенерированной Makefile.

...