CMake: Как связать статическую стороннюю библиотеку? - PullRequest
5 голосов
/ 15 августа 2011

Что у меня есть: мой код (простой main.cpp), заголовки сторонней библиотеки (EnvVar TPLIB_INCLUDE), двоичная библиотека (несколько файлов .a в TPLIB_BINARY_PATH) и следующий CMakeLists.txt:

# current source directory: CMAKE_CURRENT_SOURCE_DIR
# current binary directory: CMAKE_CURRENT_BINARY_DIR

# require 2.6 to get support for the simple IF construct
CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0)

PROJECT( simpleapp)
SET( PROGNAME simpleapp )

SET( CMAKE_COLOR_MAKEFILE ON )
SET( CMAKE_VERBOSE_MAKEFILE ON )
SET( CMAKE_INCLUDE_CURRENT_DIR TRUE )

# the actual .cpp files go here
SET(project_SOURCES
    main.cpp
)

# add here all files that need processing by Qt's MOC if there are any
set(project_MOC_SOURCES
    # files would go here
)

# add here all files that will be processed by Qt's UIC
set(project_UIS
    # all .ui files would go here
)

# additional Qt resources go here
set(project_RCCS
    # all .qrc files would go here
)

# setup Qt
FIND_PACKAGE(Qt4 REQUIRED)

INCLUDE(${QT_USE_FILE})

QT4_WRAP_CPP(test_MOCS ${project_MOC_SOURCES})
QT4_WRAP_UI(test_UIS_H ${project_UIS})
QT4_WRAP_CPP(test_MOC_UI ${project_UIS_H})
QT4_ADD_RESOURCES(test_RCC_SRCS ${project_RCCS})

include_directories( ${CMAKE_BINARY_DIR} $ENV{TPLIB_INCLUDE})

ADD_EXECUTABLE( ${PROGNAME} ${project_SOURCES} ${test_MOCS} ${test_RCC_SRCS} ${test_MOC_UI} )

link_directories($ENV{TPLIB_BINARY_PATH})

TARGET_LINK_LIBRARIES(${PROGNAME} ${QT_LIBRARIES} lib_misc lib_tools)

make Проект, создающий main.cpp.o, работает как обычно.Таким образом CMake нашел сторонние заголовки.Когда дело доходит до ссылки ld жалуется, не может найти -llib_misc и -llib_tools.Удаление строки «link_directories» или указание абсолютного имени библиотеки приводит к «Нет правила для создания цели /path/to/lib_misc.a"

Так как же сказать CMake использовать эти библиотеки только для ссылки?

1 Ответ

9 голосов
/ 15 августа 2011

link_directories($ENV{TPLIB_BINARY_PATH}) следует поместить до ADD_EXECUTABLE.

С официальных документов CMake , на link_directories имеются пометки:

Команда будет применяться только к целям, созданным после ее вызова.

...