c – 如何使用CMake链接多个库

前端之家收集整理的这篇文章主要介绍了c – 如何使用CMake链接多个库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些与DCMTK有关的代码.如果我从命令行使用g,我可以成功构建并运行它.这是代码
  1. #include "dcmtk/config/osconfig.h"
  2. #include "dcmtk/dcmdata/dctk.h"
  3.  
  4. int main()
  5. {
  6. DcmFileFormat fileformat;
  7. OFCondition status = fileformat.loadFile("test.dcm");
  8. if (status.good())
  9. {
  10. OFString patientsName;
  11. if (fileformat.getDataset()->findAndGetOFString(DCM_PatientsName,patientsName).good())
  12. {
  13. cout << "Patient's Name: " << patientsName << endl;
  14. } else
  15. cerr << "Error: cannot access Patient's Name!" << endl;
  16. } else
  17. cerr << "Error: cannot read DICOM file (" << status.text() << ")" << endl;
  18. return 0;
  19. }

这是构建命令:

  1. 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中构建它.这就是我目前拥有的:

  1. # Configure toplevel directories
  2. SET( PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Top level.")
  3. SET( INCLUDEDIR ${PREFIX}/include CACHE PATH "Include files.")
  4. SET( LIBDIR ${PREFIX}/lib CACHE PATH "Libraries.")
  5. FIND_PACKAGE ( Threads required )
  6. # Configure DCMTK
  7. FIND_PATH( DINIFTI_DCMTK_INCLUDE dcmtk
  8. PATHS ${INCLUDEDIR}
  9. PATH_SUFFIXES dcmtk
  10. DOC "Path to the DCMTK headers." )
  11. FIND_LIBRARY(DINIFTI_DCMTK_LIB NAMES dcmdata ofstd oflog
  12. HINTS ${LIBDIR} ${LIBDIR})
  13. TARGET_LINK_LIBRARIES( dinifti ${DINIFTI_DCMTK_LIB}
  14. ${DINIFTI_ZNZ_LIB}
  15. ${CMAKE_THREAD_LIBS_INIT}
  16. z )

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

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

你能帮我修一下这个错误吗?谢谢.

解决方法

看起来您希望 find_library调用使用3个单独的库填充变量DINIFTI_DCMTK_LIB.

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

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

… the HINTS option … should be paths computed by system introspection,such as a hint provided by the location of another item already found. Hard-coded guesses should be specified with the PATHS option.

我想你想要更像的东西:

  1. find_library(DINIFTI_DCMTK_LIB NAMES dcmdata PATHS ${LIBDIR})
  2. find_library(OFSTD_LIB NAMES ofstd PATHS ${LIBDIR})
  3. find_library(OFLOG_LIB NAMES oflog PATHS ${LIBDIR})
  4. target_link_libraries(dinifti ${DINIFTI_DCMTK_LIB}
  5. ${OFLOG_LIB}
  6. ${OFSTD_LIB}
  7. ${DINIFTI_ZNZ_LIB}
  8. ${CMAKE_THREAD_LIBS_INIT}
  9. z)

猜你在找的C&C++相关文章