CMake ссылка на внешнюю библиотеку


как заставить CMake связать исполняемый файл с внешней общей библиотекой, которая не строится в рамках одного проекта CMake?

просто делаю target_link_libraries(GLBall ${CMAKE_BINARY_DIR}/res/mylib.so) выдает ошибку

make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'.  Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)

после того, как я скопировал библиотеку в двоичный каталог bin/res.

Я пробовал использовать find_library(RESULT mylib.so PATHS ${CMAKE_BINARY_DIR}/res)

не с RESULT-NOTFOUND.

4 87

4 ответа:

Сначала установите путь поиска библиотек:

LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)

а потом просто сделать

TARGET_LINK_LIBRARIES(GLBall mylib)

arrowdodger является правильным и предпочтительным во многих случаях. Я просто хотел бы добавить альтернативу его ответ:

вы можете добавить "импортированную" цель библиотеки вместо каталога ссылок. Что-то вроде:

# Your-external "mylib", add GLOBAL if the imported library is located in directories above the current.
add_library( mylib SHARED IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so )

а затем ссылка, как если бы эта библиотека была построена вашим проектом:

TARGET_LINK_LIBRARIES(GLBall mylib)

такой подход даст вам немного больше гибкости: взгляните на add_library () и много target-свойства, связанные с импортированными библиотеками.

Я не знаю, решит ли это вашу проблему с "обновленными версиями libs".

я предполагаю, что вы хотите связать с библиотекой под названием фу, его имя файла обычно что-то ссылка foo.dll или libfoo.so.

1. Найдите библиотеку
Вы должны найти библиотеку. Это хорошая идея, даже если вы знаете путь к вашей библиотеке. CMake будет ошибка, если библиотека исчезла или получила новое имя. Это помогает обнаружить ошибку на ранней стадии и дать понять пользователю (возможно, самому), что вызывает проблему.
Чтобы найти библиотеку фу и сохранить путь в FOO_LIB использовать

    find_library(FOO_LIB foo)

CMake сам определит, каково фактическое имя файла. Он проверяет обычные места, такие как /usr/lib,/usr/lib64 и дороги в PATH.

вы уже знаете, где находится ваша библиотека. Добавьте его в CMAKE_PREFIX_PATH когда вы вызываете CMake, то CMake будет искать вашу библиотеку в пройденных путях тоже.

иногда вам нужно добавить подсказки или суффиксы пути, см. документацию для подробности: https://cmake.org/cmake/help/latest/command/find_library.html

2. Ссылка на библиотеку От 1 года. у вас есть полное имя библиотеки в FOO_LIB. Вы используете это, чтобы связать библиотеку с вашей целью mylib а в

  target_link_libraries(mylib "${FOO_LIB}")

вы, возможно, захотите, чтобы добавить PRIVATE,PUBLIC или INTERFACE перед библиотекой, ср. этот документация: https://cmake.org/cmake/help/latest/command/target_link_libraries.html

3. Добавить включает в себя(этот шаг может быть не обязательным.)
Если вы также хотите включить заголовочные файлы, использовать find_path аналогично find_library и поиск файла заголовка. Затем добавьте каталог include с помощью target_include_directories аналогично target_link_libraries.

документация: https://cmake.org/cmake/help/latest/command/find_path.html и https://cmake.org/cmake/help/latest/command/target_include_directories.html

если доступно для внешнего программного обеспечения, вы можете заменить find_library и find_path by find_package.

еще одна альтернатива, в случае, если вы работаете с Appstore, нужны "права" и как таковые нужно связать с Apple-Framework.

для получения права на работу (например, GameCenter) вы нужно чтобы иметь "Link Binary with Libraries" - buildstep, а затем связать с " GameKit.рамки." CMake "вводит" библиотеки на "низком уровне" в командную строку, поэтому Xcode не действительно знайте об этом, и как таковой вы будете не вам GameKit включен на экране возможностей.

один из способов использовать CMake и иметь "ссылку с двоичными файлами"-buildstep-это создать xcodeproj с CMake, а затем использовать " sed " для "поиска и замены" и добавить GameKit так, как это нравится XCode...

скрипт выглядит так (для Xcode 6.3.1).

s#\/\* Begin PBXBuildFile section \*\/#\/\* Begin PBXBuildFile section \*\/\
    26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks \*\/ = {isa = PBXBuildFile; fileRef = 26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/; };#g

s#\/\* Begin PBXFileReference section \*\/#\/\* Begin PBXFileReference section \*\/\
    26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System\/Library\/Frameworks\/GameKit.framework; sourceTree = SDKROOT; };#g

s#\/\* End PBXFileReference section \*\/#\/\* End PBXFileReference section \*\/\
\
\/\* Begin PBXFrameworksBuildPhase section \*\/\
    26B12A9F1C10543B00A9A2BA \/\* Frameworks \*\/ = {\
        isa = PBXFrameworksBuildPhase;\
        buildActionMask = 2147483647;\
        files = (\
            26B12AA11C10544700A9A2BA \/\* GameKit.framework in Frameworks xxx\*\/,\
        );\
        runOnlyForDeploymentPostprocessing = 0;\
    };\
\/\* End PBXFrameworksBuildPhase section \*\/\
#g

s#\/\* CMake PostBuild Rules \*\/,#\/\* CMake PostBuild Rules \*\/,\
            26B12A9F1C10543B00A9A2BA \/\* Frameworks xxx\*\/,#g
s#\/\* Products \*\/,#\/\* Products \*\/,\
            26B12AA01C10544700A9A2BA \/\* GameKit.framework xxx\*\/,#g

сохраните это в " gamecenter.sed", а затем "применить" его вот так ( это меняет ваш xcodeproj! )

sed -i.pbxprojbak -f gamecenter.sed myproject.xcodeproj/project.pbxproj

возможно, Вам придется изменить скрипт-команды в соответствии с вашими потребностями.

предупреждение: скорее всего, он сломается с другой версией Xcode, поскольку формат проекта может измениться, (жестко закодированный) уникальный номер может не быть уникальным-и, как правило, решения других людей лучше, поэтому, если вам не нужно поддерживать права Appstore + (и автоматические сборки), не делайте этого.

это ошибка CMake, см. http://cmake.org/Bug/view.php?id=14185 и http://gitlab.kitware.com/cmake/cmake/issues/14185