我正在使用macOS索诺马14.2,我正在使用Apple clang版本15.0.0(clang-1500.1.0.2.5)、cmake版本3.28.0和GNU Make 3.81。我使用CLion 2023.3(Build #CL-233.11799.238,构建于2023年12月1日)作为IDE,据我所知,通过cmake构建应用程序的标准方式。
在启动构建应用程序时,我从动态链接器收到以下错误消息。应用程序的构建工作正常,并且在构建过程的日志中没有发现链接错误。
dyld[8397]: Symbol not found: _divsufsort64
Referenced from: <12C04522-55DC-3F19-8288-E875505D9BCE> /Users/<user>/Documents/projects/problems_linker/cmake-build-debug/problems_linker
Expected in: <no uuid> unknown
字符串
下面是一个产生上述错误的最小代码示例:(两个文件都在同一个目录中)
CMakeLists.txt
cmake_minimum_required(VERSION 3.27)
project(problems_linker C)
set(CMAKE_C_STANDARD 11)
set(SOURCES
main.c
)
set(INCLUDES
${CMAKE_CURRENT_BINARY_DIR}
/usr/local/include
/usr/local/lib
)
add_executable(problems_linker main.c)
target_include_directories(${PROJECT_NAME} PRIVATE ${INCLUDES})
find_package(ZLIB)
target_link_libraries(${PROJECT_NAME} PRIVATE ZLIB::ZLIB)
target_link_libraries(${PROJECT_NAME} PRIVATE /usr/local/lib/libdivsufsort64.dylib)
型
main.c
#include <stdio.h>
#include <divsufsort64.h>
#include <zlib.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
gzFile gz;
const uint8_t bs[] = {2, 3, 1, 0};
long long n = 4;
int64_t* sa = malloc(n * sizeof(*sa));
if(divsufsort64(bs, sa, n) < 0)
{
}
printf("Works\n");
return 0;
}
型
使用以下命令时不应出现此错误,但使用CLion IDE的运行按钮时会出现此错误。使用带有以下命令的命令行,项目将在没有任何错误的情况下构建并运行。
mkdir build
cd build
cmake ..
make
./problems_linker
型
请注意,这是一个重现错误的最小示例,不是用于解决任何真实的问题的非常漂亮的代码。我也在示例中包含了ZLIB,因为ZLIB是唯一的库,出于某种原因仍然可以工作。
我通过brew安装了divsufsort和ZLIB:
divsuffsort:
brew tap brewsci/bio
brew install Formula/libdivsufsort
型
zlib:
brew install zlib
型
我搜索并测试了设置DYLD_BULBACK_LIBRARY_PATH变量,但这并没有改变任何东西。我尝试了CMakeLists的许多变体,包括find_library调用等,但没有改变错误消息。
我通过命令行和CLion测试了旧项目,它们在CLion和命令行上都能在完成日期工作,并遇到了如上所述的相同问题。
任何帮助和想法都很感激。谢谢。
编辑:(基于@uta的评论)
我测试了这个问题的每一个建议,把它们加在一起得到了下面的修改后的CMakeLists.txt,但是错误仍然是一样的。
cmake_minimum_required(VERSION 3.27)
project(problems_linker C)
set(CMAKE_C_STANDARD 11)
set(SOURCES
main.c
)
set(INCLUDES
${CMAKE_CURRENT_BINARY_DIR}
/usr/local/include
/usr/local/lib
)
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
add_executable(problems_linker main.c)
target_include_directories(${PROJECT_NAME} PRIVATE ${INCLUDES})
find_package(ZLIB)
find_library(DIVSUFSORT libdivsufsort64 PATHS /usr/local/lib/)
target_link_libraries(${PROJECT_NAME} PRIVATE ZLIB::ZLIB)
target_link_libraries(${PROJECT_NAME} PRIVATE ${DIVSUFSORT})
型
我也不能从命令行用上面的CMakeLists文件构建它,它说,变量DIVSUFSORT不可用。
我想指出的是,链接器可以正确地找到所有路径,只有动态链接器会失败。
1条答案
按热度按时间bybem2ql1#
通过将DYLD_LIBRARY_PATH=/usr/local/lib/(.dylib文件的路径)添加到Run/MySQL中的环境变量中,它可以再次正常工作。
我试着在其他位置设置它,没有一个工作。DYLD_bullback_LIBRARY_PATH变量也不工作。
请注意,这只是一种变通方法。