2013-04-16 6 views
1

Наша компания использует CMake для создания наших исполняемых файлов для Windows. Я работаю над тем, чтобы наше приложение работало на Mac. Пока приложение отлично работает на Mac. Однако, когда я пытаюсь открыть исполняемый файл, который CMake создает для Mac, я получаю следующее сообщение об ошибке в окне терминала:CMake Build Mac App

Last login: Tue Apr 16 14:34:58 on ttys001 
Locals-MacBook-Pro:~ auser$ /Users/auser/Documents/Projects/CodeMonkey/bin/CmDeveloperKit ; exit; 
dyld: Library not loaded: libAbcSupport.dylib 
    Referenced from: /Users/auser/Documents/Projects/CodeMonkey/bin/CmDeveloperKit 
    Reason: image not found 
Trace/BPT trap: 5 
logout 

[Process completed] 

Я имею в виду, что CMakeLists.txt для проекта не может быть настроена правильно для создания исполняемого файла для Mac. Я включил его ниже:

# Includes the common stuff for CodeMonkey 
include(CmConfig) 

# Set the file description 
set(CMDEVELOPERKIT_FILE_DESCRIPTION "CodeMonkey Application") 

# Configures this CodeMonkey module 
CmModuleConfig(CmDeveloperKit FIND CodeMonkey CodeMonkeyGui) 

# Get source files for CodeMonkeyGui 
set(PROJECT_SOURCES ${PROJECT_SOURCES} Main.cpp) 
# Only add resource files on Windows 
if(WIN32) 
    # Get header files for CodeMonkeyGui 
    set(PROJECT_HEADERS ${PROJECT_HEADERS} CmIcon.h) 
    # Get source files for CodeMonkeyGui 
    set(PROJECT_RESOURCES ${PROJECT_RESOURCES} CmIcon.rc) 
endif(WIN32) 

# Add additional include directories 
include_directories(${CODEMONKEY_INCLUDE_DIR} ${CODEMONKEYGUI_INCLUDE_DIR} ${ABC_INCLUDE_DIR}) 
# Add additional link directories 
link_directories("${ABC_LIBRARY_DIR}") 

# Creates the executable 
if(WIN32) 
    add_executable(${PROJECT_NAME} WIN32 ${PROJECT_SOURCES} ${PROJECT_HEADERS} ${PROJECT_RESOURCES}) 
    # Sets entry point to main 
    set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/ENTRY:\"mainCRTStartup\"") 
else() 
    add_executable(${PROJECT_NAME} ${PROJECT_SOURCES} ${PROJECT_HEADERS} ${PROJECT_RESOURCES}) 
endif(WIN32) 

# Add the d in debug 
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX d) 

# Links to the other required libs 
target_link_libraries(${PROJECT_NAME} ${CODEMONKEY_LIBRARY} ${CODEMONKEYGUI_LIBRARY} 
         ${ABC_ARASUPPORT_LIBRARY} ${ABC_ARAGUI_LIBRARY}) 
# Sets the appropriate dependencies 
add_dependencies(${PROJECT_NAME} ${CODEMONKEY_NAME} ${CODEMONKEYGUI_NAME}) 

# Configure the install procedures 
CmModuleInstall() 

Может кто-то пожалуйста, дайте мне знать, что я не хватает или у плохого в указанном файле? Если этот файл не является проблемой, можете ли вы указать мне правильное направление для исправления?

+0

Добавил ли путь к каталогу, содержащему 'libAbcSupport.dylib', переменной' DYLD_LIBRARY_PATH', прежде чем пытаться выполнить приложение? –

+0

@ Haroogan Вау, я должен быть честным и сказать, что я не думал, что это сработает сначала. Похоже, что проблема была решена. Можете ли вы опубликовать это как ответ и более подробно объяснить, что это делает? Кроме того, есть ли все-таки включить libAbcSupport.dylib в приложение Mac, поэтому мне не нужно изменять переменные среды, чтобы запустить приложение? (reposting comment, чтобы вы получили уведомление и потому, что мне не хватает времени для его редактирования) – robhasacamera

+0

У меня есть оба уведомления ':)' вы можете удалить один из них сейчас. Я скоро отправлю ответ. –

ответ

4

Перед запуском приложения вы должны добавить путь к каталогу, содержащему libAbcSupport.dylib, в переменную окружения DYLD_LIBRARY_PATH.

Для справки, приведена справочная руководство по OS X dyld(1). Экстракт:

DYLD_LIBRARY_PATH

Это двоеточиями список каталогов, содержащих библиотеки. Динамический компоновщик выполняет поиск в этих каталогах до того, как он выполнит поиск по умолчанию для библиотек. Он позволяет тестировать новые версии существующих библиотек.

Для каждой библиотеки, которую использует программа, динамический компоновщик в свою очередь ищет ее в каждом каталоге в DYLD_LIBRARY_PATH. Если он все еще не может найти библиотеку, он затем поочередно ищет DYLD_FALLBACK_FRAMEWORK_PATH и DYLD_FALLBACK_LIBRARY_PATH.

Если вы хотите, чтобы это было вне коробки, то есть без необходимости устанавливать эту переменную вручную, то, к примеру, вы должны просто добавить надлежащий процесс установки в CMakeLists. По умолчанию DYLD_LIBRARY_PATH, вероятно, содержит некоторые каталоги, системные и пользовательские. Просто проверить это:

echo $DYLD_LIBRARY_PATH 

и обратитесь к документации, на которой каталог является предпочтительным (или вид обычного) для развертывания библиотеки для 3-сторонних приложений на Mac OS X. Тогда все, что вам придется сделать, это программа CMakeLists, так что при запуске make install он разворачивает libAbcSupport.dylib в такой каталог.

ПРИМЕЧАНИЕ: Вы не сталкиваются с этой проблемой на Windows, потому что в то время как Windows, поиск переменной PATH среды, чтобы найти библиотеки DLL тоже, он также выполняет поиск в текущем каталоге приложения (которое не так как для Mac OS X и Linux). Другими словами, в Windows вы, скорее всего, развертываете AbcSupport.dll в том же каталоге, что и ваше приложение, и поэтому не нужно беспокоиться об этом.

ПРИМЕЧАНИЕ: В этом отношении Linux похож на Mac OS X. Поэтому, если вам когда-либо придется переносить приложение в Linux, не забывайте, что вам понадобится LD_LIBRARY_PATH.Вот LD.SO(8) людей-страница Руководства по Linux программиста, и соответствующая выдержка:

LD_LIBRARY_PATH переменной среды содержит разделенные двоеточия списка каталогов, в которых ищутся по dynamic linker при поиске общей библиотеки для загрузки.

Каталоги просматриваются в порядке их упоминания в.

Если не указано, компоновщик использует значение по умолчанию, которое /lib:/usr/lib:/usr/local/lib.