如何使用CMake链接多个库
How to link multiple libraries using CMake
我有一些与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'
你能帮我修复这个错误吗?谢谢你。
看起来您希望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)
相关文章:
- 从方法链接中使用的临时移动
- 弱链接与使用 COMDAT 部分有什么区别?
- Crypto 库链接错误使用Visual Studio 2017
- 如何链接一个使用其他库的静态C库
- 初学者C 排序的链接列表使用=操作员进行深层复制
- C 双重链接列表 - 使用pop_back()从尾部删除元素
- 在Visual Studio 2010中使用大型查找表的链接限制使用代码库的限制
- 如何在 ROS Indigo 下正确链接 opencv3(使用 CMake)
- GCC链接器:使用了哪些输入库
- 深层复制和解构器前哨链接列表使用节点
- g++链接错误:使用#define编写函数名称时,未定义对函数的引用
- 发布模式下的正则表达式提升库链接在使用 mingw-w64 工具链时警告"duplicate section has different size"
- 链接/编译使用 boost/filesystem.hpp 的程序
- 链接错误 使用 Cmake 文件在 Visual Studio 中构建 Qt 项目
- Visual Studio C++链接未使用的全局变量
- 声明要在链接之前使用的类成员函数
- 使用libmx链接并使用std::stringstream时发生g++malloc错误
- 在不同项目(没有编译时链接)使用的标头中声明的纯抽象C++类是否共享相同的虚拟表模型
- C++链接是否足够聪明,可以避免链接未使用的库
- 如何让Xcode链接并使用Boost文件系统调试应用程序