CMake Build Mac App

时间:2013-04-16 19:53:38

标签: macos cmake shared-libraries ld dynamic-linking

我们公司目前使用CMake构建我们的Windows可执行文件。我正在努力使我们的应用程序在Mac上运行。到目前为止,该应用程序在Mac上构建良好。但是,当我尝试打开CMake为Mac创建的可执行文件时,我在终端窗口中收到以下错误:

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()

有人可以告诉我上述文件中遗失或错误的内容吗?如果这个文件不是问题,你可以指出我正确的方向进行修复吗?

1 个答案:

答案 0 :(得分:3)

在启动应用程序之前,您应该将包含libAbcSupport.dylib的目录的路径添加到DYLD_LIBRARY_PATH环境变量。

作为参考,这是OS X手册的dyld(1)手册页。提取物:

  

DYLD_LIBRARY_PATH

     

这是一个以冒号分隔的包含库的目录列表。动态链接器在搜索库的默认位置之前搜索这些目录。它允许您测试现有库的新版本。

     

对于程序使用的每个库,动态链接器依次在DYLD_LIBRARY_PATH的每个目录中查找它。如果仍无法找到该库,则会依次搜索DYLD_FALLBACK_FRAMEWORK_PATHDYLD_FALLBACK_LIBRARY_PATH

如果您希望这是开箱即用的,即无需手动设置此变量,那么,您应该只需将正确的安装过程添加到CMakeLists中。默认情况下,DYLD_LIBRARY_PATH可能包含一些目录,系统目录和用户目录。只需查看:

echo $DYLD_LIBRARY_PATH

并查阅有关在Mac OS X上为第三方应用程序部署库的首选目录(或传统类型)的文档。然后,您只需编程CMakeLists以便在运行时make install libAbcSupport.dylibPATH部署到此目录中。

注意:您在Windows上没有遇到此问题,因为Windows搜索AbcSupport.dll环境变量以查找DLL时,它也会搜索应用程序的当前目录(对于Mac OS X和Linux都不是这种情况。换句话说,在Windows上,您很可能将LD_LIBRARY_PATH部署在与应用程序相同的目录中,因此不必担心这一点。

注意: Linux在这方面类似于Mac OS X.因此,如果您还需要将应用程序移植到Linux,请不要忘记在那里需要LD_LIBRARY_PATH。这是Linux程序员手册的LD.SO(8)手册页,以及相关的摘录:

  

/lib:/usr/lib:/usr/local/lib环境变量包含以冒号分隔的目录列表,dynamic linker在查找要加载的共享库时会搜索这些目录。

     

按照提及的顺序搜索目录。

     

如果未指定,链接器将使用默认值{{1}}。