Проект CMake использует библиотеку, которая зависит от другой библиотеки
У меня проблема с использованием 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 ответ
Вы пытались изменить порядок, в котором библиотеки указаны в TARGET_LINK_LIBRARIES? Во многих случаях это не должно иметь значения, но я сталкивался с случаями с определенными компоновщиками, где это происходит. Я считаю, что компоновщик GNU в Linux - это тот случай, когда он имеет значение.
Я думаю, что xr_arp.a должен появиться первым, чтобы компоновщик знал, что нужно искать SHA1 в библиотеках, которые следуют за ним.
В противном случае попробуйте запустить "make VERBOSE=1" и сравнить команду компоновщика, сгенерированную CMake, с командой, сгенерированной Makefile.