Как мне исправить этот файл cmake? - проблема с подключением к импортированной библиотеке - PullRequest
2 голосов
/ 23 июня 2010

Я только начинаю с cmake и пытаюсь настроить довольно простой проект.Хотя сам проект прост, он ссылается на ряд статических библиотек, которые не созданы cmake.Полагаю, они могут быть - это мои библиотеки - но мне все равно нужно разобраться, как ссылаться на сторонние библиотеки.

Вот что у меня есть ...

cmake_minimum_required(VERSION 2.8.1)
cmake_policy(VERSION 2.8.1)

project( test01 )

include_directories("../../cpplib/sh_core" "../../cpplib/sh_core2" "../../cpplib/sh_genlib")

link_directories("../../cpplib/_vc_debug")

add_library( sh_core   STATIC IMPORTED )
add_library( sh_core2  STATIC IMPORTED )
add_library( sh_genlib STATIC IMPORTED )

add_executable( test01 test01 test01_ast test01_parse test01_scan test01_main )
target_link_libraries(test01 sh_core sh_core2 sh_genlib)

Проблема в том, что на три библиотеки, на которые я пытаюсь ссылаться, нет правильной ссылки в сгенерированном файле проекта.Они перечислены как sh_core-NOTFOUND, sh_core2-NOTFOUND и sh_genlib-NOTFOUND.

Я думаю возможно, мне не нужен link_directories сверху, но мне нужен find_library команда.Но я быстро взглянул на эту команду в документации и ... WTF !!!У меня уже есть головная боль, и я действительно не могу справиться с этой массой, казалось бы, избыточной сложности банкомата.Кроме того, видя такую ​​большую сложность для чего-то, что должно быть совершенно простым, можно предположить, что я ищу не в том месте.

Итак ... как мне сказать cmake, где найти эти библиотеки?

Дополнительный вопрос - как мне это настроить, чтобы сгенерированный проект обрабатывал как отладочную сборку, так и сборку выпуска?Примечание. Версии выпуска импортированных библиотек имеют те же имена файлов, но находятся в папке "../../cpplib/_vc_release".

Ответы [ 2 ]

6 голосов
/ 26 июня 2010

Я думаю, вы неправильно поняли директивы include_directories и add_library .

include_directories добавляет каталоги для поиска включаемых файлов, тогда как add_library можетбыть использованы следующим образом (в вашем случае):

add_library(core UNKNOWN IMPORTED)
set_target_properties(core PROPERTIES IMPORTED_LOCATION "../../cpplib/_vs_release/core.lib")

Однако, если я правильно понимаю, что вы пытаетесь достичь, что-то вроде этого должно сделать это:

set(CPPLIB_DIR "${CMAKE_SOURCE_DIR}/../../cpplib")

set(CPPLIB_DEBUG_DIR "${CPPLIB_DIR}/_vc_debug")
set(CPPLIB_RELEASE_DIR "$(CPPLIB_DIR}/_vc_release")

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    set(CPPLIB_LIB_HINT ${CPPLIB_RELEASE_DIR})
else ()
    set(CPPLIB_LIB_HINT ${CPPLIB_DEBUG_DIR})
endif ()

find_library(CPPLIB_CORE_LIBRARY NAMES "core"
                                 PATHS ${CPPLIB_LIB_HINT})

find_library(CPPLIB_CORE2_LIBRARY NAMES "core2"
                                  PATHS ${CPPLIB_LIB_HINT})

find_library(CPPLIB_GENLIB_LIBRARY NAMES "genlib"
                                   PATHS ${CPPLIB_LIB_HINT})

if (("${CPPLIB_CORE_LIBRARY}" STREQUAL "CPPLIB_CORE_LIBRARY-NOTFOUND") OR
    ("${CPPLIB_CORE2_LIBRARY}" STREQUAL "CPPLIB_CORE2_LIBRARY-NOTFOUND") OR
    ("${CPPLIB_GENLIB_LIBRARY}" STREQUAL "CPPLIB_GENLIB_LIBRARY-NOTFOUND"))
    message(FATAL_ERROR "One of the libs wasn't found!")
endif ()

set(CPPLIB_LIBRARIES ${CPPLIB_CORE_LIBRARY} ${CPPLIB_CORE2_LIBRARY} ${CPPLIB_GENLIB_LIBRARY})

target_link_libraries(my_exe ${CPPLIB_LIBRARIES})

РЕДАКТИРОВАТЬ: Если вы также хотите включить некоторые заголовки, это просто:

find_path(CPPLIB_INCLUDE_DIR "my_header.h"
    PATHS ${CPPLIB_HINT_INCLUDE_DIR})

...

include_directories(${CPPLIB_INCLUDE_DIR})
1 голос
/ 26 февраля 2011

Продолжение ответа the_void :

Вы должны быть в состоянии упростить выражение if test, которое гласит:

if (("${CPPLIB_CORE_LIBRARY}" STREQUAL "CPPLIB_CORE_LIBRARY-NOTFOUND") OR
    ("${CPPLIB_CORE2_LIBRARY}" STREQUAL "CPPLIB_CORE2_LIBRARY-NOTFOUND") OR
    ("${CPPLIB_GENLIB_LIBRARY}" STREQUAL "CPPLIB_GENLIB_LIBRARY-NOTFOUND"))
    message(FATAL_ERROR "One of the libs wasn't found!")
endif ()

быть примерно таким:

if (CPPLIB_CORE_LIBRARY OR
    CPPLIB_CORE2_LIBRARY OR
    CPPLIB_GENLIB_LIBRARY)
    message(FATAL_ERROR "One of the libs wasn't found!")
endif ()

Ссылка Оператор if CMake .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...