动态链接器无法使用CLion在C中找到库

bejyjqdl  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

我正在使用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不可用。
我想指出的是,链接器可以正确地找到所有路径,只有动态链接器会失败。

bybem2ql

bybem2ql1#

通过将DYLD_LIBRARY_PATH=/usr/local/lib/(.dylib文件的路径)添加到Run/MySQL中的环境变量中,它可以再次正常工作。
我试着在其他位置设置它,没有一个工作。DYLD_bullback_LIBRARY_PATH变量也不工作。
请注意,这只是一种变通方法。

相关问题