我们公司目前使用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()
有人可以告诉我上述文件中遗失或错误的内容吗?如果这个文件不是问题,你可以指出我正确的方向进行修复吗?
答案 0 :(得分:3)
在启动应用程序之前,您应该将包含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
并查阅有关在Mac OS X上为第三方应用程序部署库的首选目录(或传统类型)的文档。然后,您只需编程CMakeLists
以便在运行时make install
libAbcSupport.dylib
将PATH
部署到此目录中。
注意:您在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}}。