【问题标题】:How to link multiple libraries using CMake如何使用 CMake 链接多个库
【发布时间】:2013-02-18 21:07:03
【问题描述】:

我有一些与 DCMTK 相关的代码。如果我从命令行使用 g++,我可以成功构建并运行它。这是代码:

#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"

int main()
{
DcmFileFormat fileformat;
OFCondition status = fileformat.loadFile("test.dcm");
if (status.good())
{
   OFString patientsName;
   if (fileformat.getDataset()->findAndGetOFString(DCM_PatientsName, patientsName).good())
   {
      cout << "Patient's Name: " << patientsName << endl;
   } else
     cerr << "Error: cannot access Patient's Name!" << endl;
} else
cerr << "Error: cannot read DICOM file (" << status.text() << ")" << endl;
return 0;
}

这是构建命令:

g++ testeapp.cxx -DHAVE_CONFIG_H -I/path_to_dcmtk/include -L/path_to_dcmtk/lib -pthread -ldcmdata -lz -loflog -lofstd -o main

我想制作一个 CMakeLists.txt 以在 Kdevelop 中构建它。这是我目前拥有的:

    # Configure toplevel directories
    SET( PREFIX     ${CMAKE_INSTALL_PREFIX} CACHE PATH "Top level.")
    SET( INCLUDEDIR ${PREFIX}/include       CACHE PATH "Include files.")
    SET( LIBDIR     ${PREFIX}/lib           CACHE PATH "Libraries.")
    FIND_PACKAGE ( Threads REQUIRED )
    # Configure DCMTK
    FIND_PATH( DINIFTI_DCMTK_INCLUDE dcmtk
               PATHS ${INCLUDEDIR}
               PATH_SUFFIXES dcmtk
               DOC "Path to the DCMTK headers." )
    FIND_LIBRARY(DINIFTI_DCMTK_LIB NAMES dcmdata ofstd oflog 
                 HINTS ${LIBDIR} ${LIBDIR})
TARGET_LINK_LIBRARIES( dinifti ${DINIFTI_DCMTK_LIB}
                               ${DINIFTI_ZNZ_LIB}
                               ${CMAKE_THREAD_LIBS_INIT}
                               z )             

但是当我构建它时,它有这个错误:

/usr/local/lib/libdcmdata.a(dcfilefo.o): In function `DcmFileFormat::remove(DcmItem*)':
dcfilefo.cc:(.text+0x1788): undefined reference to `log4cplus::Logger::forcedLog(int, OFString const&, char const*, int, char const*) const'

你能帮我解决这个错误吗?谢谢。

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    您似乎希望 find_library 调用使用 3 个独立的库填充变量 DINIFTI_DCMTK_LIB

    find_library 不是这样工作的。 NAMES 之后的不同参数表示单个库可以调用的所有不同名称。这允许该命令跨平台工作,其中同一个库可以在不同平台上被称为不同的东西。

    一个小问题是您可能应该更喜欢在这里使用PATHS 而不是HINTS。形成文档:

    ...HINTS 选项...应该是系统自省计算的路径,例如由已找到的另一个项目的位置提供的提示。应使用PATHS 选项指定硬编码猜测。

    我想你想要的更像是:

    find_library(DINIFTI_DCMTK_LIB NAMES dcmdata PATHS ${LIBDIR})
    find_library(OFSTD_LIB NAMES ofstd PATHS ${LIBDIR})
    find_library(OFLOG_LIB NAMES oflog PATHS ${LIBDIR})
    target_link_libraries(dinifti ${DINIFTI_DCMTK_LIB}
                                  ${OFLOG_LIB}
                                  ${OFSTD_LIB}
                                  ${DINIFTI_ZNZ_LIB}
                                  ${CMAKE_THREAD_LIBS_INIT}
                                  z)
    

    【讨论】:

    • DCMTK还有一个查找模块;也许find_package(DCMTK REQUIRED) 会有所帮助?
    • @Angew 好点,但the docs 有点欠缺:-)
    猜你喜欢
    • 2021-12-05
    • 2019-12-22
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多