代码之家  ›  专栏  ›  技术社区  ›  ShanZhengYang

如何修改CMakeList。txt:找到库,但存在链接错误

  •  0
  • ShanZhengYang  · 技术社区  · 7 年前

    我正在创建一个C库,该库将使用cmake构建,使用Mac OS进行开发。在CMAKEL列表中。txt,我有以下内容

    #htslib
    find_package(htslib REQUIRED)
    include_directories(${HTSLIB_INCLUDE_DIR})
    
    
    target_link_libraries(projectname ${HTSlib_LIBRARIES})
    

    输出于 cmake ..

    Found hstlib 
    

    然而,在 make ,我收到链接器错误:

    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    所以它可以找到库,并且库肯定安装了 sudo make install ,但仅此库存在链接错误。

    (1) 我猜是吧 find_package(htslib REQUIRED) 正在寻找其他东西。我怎样才能知道是什么?

    (2) 如何在CMakeList中显式写入。txt查找我知道已正确安装的库?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Unapiedra    7 年前
    1. 使用 VERBOSE=1 make 查看链接器输出。搜索 -lhtslib
    2. 阅读文档了解具体的 Find<LIB>.cmake

    您的具体问题:

    1. “如何找到CMake发现的内容”:使用 cmake-gui ccmake 。它们都显示相同的信息,但一个是GUI,另一个是Curses界面。在高级模式下(“t”打开 Cmake公司 )您将找到搜索包的所有变量。此外,您可以使用 MESSAGE(STATUS "Found htslib at: ${htslib_LIBRARIES}")
    2. “如何在CMakeLists.txt中明确写入库所在的位置?”请不要那样做!CMake的目的就是将这种信息提取出来。您有两个选项,第一个是好的选项:在命令行(或上面提到的GUI)上配置cmake,以获得 CMAKE_MODULES_PATH 或对库的更具体提示 -D htslib_PATH=/usr/local/.../ (指向目录,其中 libhts.dylib 驻留)。更糟糕的解决方案是向 find_package find_package(htslib REQUIRED PATH /usr/local/lib) find_package(htslib REQUIRED HINT /usr/local/lib /some/second/path/where/it/may/be)

    解决方案

    链接的项目具有自定义 FindHTSlib.cmake link .这个使用 pkg_config 配置库。为了复制你的问题,我使用 酿造 要安装 htslib 。可以找到pkg配置文件(对我来说,但是 brew info htslib 告诉你)根据 /usr/local/Cellar/htslib/1.8/lib/htslib.pc .那么,让我们给CMake一个必要的提示。

    我无法测试这个,因为对我来说,它直接找到了htslib包,没有进一步的提示。

    git clone https://github.com/D-Lo/bamdb # I am using version f5f03d0
    mkdir -p bamdb/build; cd bamdb/build
    brew install ck htslib lmdb
    cmake ..  # -G Ninja recommended, but needs brew install ninja
    make # lot's of missing symbols
    

    我建议在 CMakeLists.txt CMake的最低要求版本为2.8到 3.10 (或至少3.6)。

    这是我得到的错误:

    [ 62%] Linking C shared library libbamdb.dylib
    /usr/local/Cellar/cmake/3.11.1/bin/cmake -E cmake_link_script CMakeFiles/libbamdb.dir/link.txt --verbose=1
    /Library/Developer/CommandLineTools/usr/bin/cc -Wall -g -std=gnu99 -fPIC -dynamiclib -Wl,-headerpad_max_install_names  -o libbamdb.dylib -install_name @rpath/libbamdb.dylib CMakeFiles/libbamdb.dir/src/bam_api.c.o CMakeFiles/libbamdb.dir/src/bam_lmdb.c.o CMakeFiles/libbamdb.dir/src/bamdb.c.o
    Undefined symbols for architecture x86_64:
      "_bam_destroy1", referenced from:
          _get_bam_row in bam_api.c.o
          _deserialize_func in bam_lmdb.c.o
    

    可以通过在 CMakeLists。txt文件 ,在该行之后 add_library(libbamdb ${SOURCES}) :

    target_link_libraries(libbamdb ${LIBS})
    

    进一步说明:您现在有了一个具有 main 作用这是因为 ${SOURCES} 用于构建可执行文件和库。这可能会产生意想不到的副作用。除非有必要,否则不要这样做。