2

我们公司目前使用 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()

有人可以让我知道我在上面的文件中遗漏了什么或有问题吗?如果这个文件不是问题,你能指出我正确的修复方向吗?

4

1 回答 1

4

在启动应用程序之前,您应该将包含目录的路径添加libAbcSupport.dylibDYLD_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

并查阅文档,了解哪个目录更适合(或某种传统)在 Mac OS X 上为 3rd 方应用程序部署库。然后您所要做的就是进行编程CMakeLists,以便在运行make install时将其部署libAbcSupport.dylib到这样的目录中。

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

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

LD_LIBRARY_PATH环境变量包含一个以冒号分隔的目录列表,动态链接器在查找要加载的共享库时搜索这些目录。

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

如果未指定,则链接器使用默认值,即/lib:/usr/lib:/usr/local/lib.

于 2013-04-17T15:05:14.763 回答