2015-04-21 2 views
1

Я работаю над основным проектом, имеющим несколько сторонних библиотек. Моя цель состоит в том, чтобы импортировать все из них в качестве импортированной цели для ясности, но я не могу заставить ее работать. Это в основном набор статических библиотек (.lib/lib .a) и их заголовки.Связать статические библиотеки с основным проектом через импортированный объект

Для обсуждения главным является главная цель, третье - импортированное третье лицо.

Мне удалось создать правильное решение Visual Studio в Windows, но в Linux это не работает. При построении решения, я в конечном итоге с этой ошибкой:

"No rule to make target 'Third-NOTFOUND', needed by '../Bin/Main'" 

Вот некоторые фрагменты кода из моих CMakeLists.txt годов.

Мэйн CMakeLists.txt:

project(Main) 
[...] 
add_subdirectory(ThirdParty/Third) 
set_property(TARGET Third PROPERTY FOLDER "thirdparty") 
[...] 
add_executable(Main ${SOURCES}) 
target_link_libraries(Main PRIVATE Third) 

ТРЕТЬЕГО в CMakeLists.txt:

project(Third) 
[...] 
# Helper function 
function(append_lib target lib_debug_dir lib_release_dir name) 
    set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_DEBUG "${lib_debug_dir}/${LIB_NAME}") 
    set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_RELEASE "${lib_release_dir}/${LIB_NAME}") 
endfunction() 
[...] 
add_library(Third STATIC IMPORTED GLOBAL) 
set_property(TARGET Third APPEND PROPERTY PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}") 

append_lib(Third ${LIB_DIR_DEBUG} ${LIB_DIR_RELEASE} libMyLib1.a) 

NB: Код для Linux и Windows, один и те же, за исключением имени статической библиотеки (это само MyLib1.lib заменяет libMyLib1.a)

Что я делаю неправильно? Спасибо :)

+0

Это вопрос пути? Этот ответ относится к вам: http://stackoverflow.com/questions/14077611/how-do-i-tell-cmake-to-link-in-a-static-library-in-the-source-directory –

+0

I не думайте так. Я только что проверил это снова, это все правильные абсолютные пути. –

+0

Если вы проверите сгенерированный Makefile, вы видите абсолютные пути там? –

ответ

2

Наконец-то мне удалось получить то, что я хотел, хотя я не мог найти способ получить метод, который работает в обеих системах.

В Windows я придерживаюсь того, что я описал в своем вопросе.

В Linux, однако, я нашел некоторое обходное решение. Я импортирую одну библиотеку как IMPORTED_LOCATION, а все остальные - как INTERFACE_LINK_LIBRARIES. Это не здорово, но если я не укажу импортированное местоположение, я получаю ошибку Third-NOTFOUND.

Как предложил Антонио, я использую CMAKE_BUILD_TYPE для связи разных библиотек в разных конфигурациях.

Спасибо вам за помощь!

0

Если он работает в Windows, а не в Unix, это очень вероятно из-за оболочки пути: именно вы имеете непоследовательное использование символов в верхнем и нижнем регистре в именах папок. Это допускается в Windows, но безжалостно наказывали в Unix :)

Решение: Проверьте, как вы видите thirdparty все вокруг вашего проекта (Здесь я вижу thirdparty и ThirdParty).

+0

Благодарим вас за ответ! Я дважды проверял каждый путь, и я уверен, что они верны, даже если рассматривать ловушку обсадной колонны (уже попавшей в это: P) Однако проблема, похоже, исходит от имущества, которое я использую. IMPORTED_LOCATION_DEBUG/RELEASE приводит к ошибке Third-NOTFOUND. Использование метода IMPORTED_LOCATION решает проблему (однако не может указывать разные библиотеки для разных конфигураций), но при добавлении всех из них добавляется следующая опция в /CMakeFiles/Main.dir/link.txt -o "/libLib1 .a; /libLib2.a; [...] " , которые приводят к ошибке lib, не найденной ... –

+0

Удаление двойных кавычек и замена запятых пробелами решает проблему. Я ищу способ добавить несколько IMPORTED_LOCATION сейчас (и все еще ищу способ разграничения настроек Debug и Release :)) –

+0

@AlexandreZ. Вы указываете тип сборки? Добавление чего-то типа -DCMAKE_BUILD_TYPE = Debug или -DCMAKE_BUILD_TYPE = Отпустить в командную строку cmake (или установить его из cmake-gui, что проще на самом деле). – Antonio

Смежные вопросы