如何使用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 thePATHS
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)
非常感谢你。这是正确的 – user2039786 2013-03-05 02:26:40
好东西。随意标记答案为正确的;-) – Fraser 2013-03-05 02:28:47
还有一个用于DCMTK的查找模块;也许'find_package(DCMTK REQUIRED)'会有帮助吗? – Angew 2013-03-05 09:21:07