如何使用CMake链接多个库

问题描述:

我有一些关于DCMTK的代码。如果我从命令行使用g ++,我可以成功构建并运行它。这是代码:如何使用CMake链接多个库

#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' 

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

它看起来像你期望find_library调用填充变量DINIFTI_DCMTK_LIB与3个独立的库。

这不是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.

我想像你想要的东西更像:

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) 
+0

非常感谢你。这是正确的 – user2039786 2013-03-05 02:26:40

+0

好东西。随意标记答案为正确的;-) – Fraser 2013-03-05 02:28:47

+1

还有一个用于DCMTK的查找模块;也许'find_package(DCMTK REQUIRED)'会有帮助吗? – Angew 2013-03-05 09:21:07