別のライブラリに依存するライブラリを使用するCMakeプロジェクト

私はLinuxで64ビットのCMakeの使用に問題があります。私は別のlib(libcrypto.a)へのリンクの依存関係を持つライブラリ(xr_arp.a)にリンクする必要があるCのサンプルを持っています。私のサンプルコードをビルドするために行った次のmakefileは正常にリンクしています:

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 $<

しかし、私はこのメイクファイルを代わりにCMakeを使用するように変換したいと思います。次のCMakeLists.txtファイルを使用すると、xr_arp.aがlibcrypto.aにリンクできないように見えるので、xr_arp.cには `SHA1 'への未定義の参照があります。

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
)

誰かが2つのファイルの違いを教えてもらえますか?なぜそれがmakefileを使って動作しているのですが、それはCMakeではありませんか? xr_arp.aとlibcrypto.aの間のリンクを強制するために使用できる手順はありますか?両方のライブラリはサードパーティ製で、私のものではないことに注意してください。

3

1 答え

ライブラリがTARGET_LINK_LIBRARIESに指定されている順番を切り替えようとしましたか?多くの場合、それは違いをもたらすべきではありませんが、特定のリンカーを使用してケースに入りました。私は、Linux上のGNUリンカーは違いがあるケースだと考えています。

私は、xr_arp.aが最初に現れるはずだから、リンカーはそれに続くライブラリでSHA1を探すことを知っていると思います。

それに失敗したら、 "make VERBOSE = 1"を実行し、CMakeによって生成されたリンカコマンドとMakefileによって生成されたリンカコマンドを比較してみてください。

5
追加された
ありがとう!
追加された 著者 thewalrusnp,