【问题标题】:Creation of a cmake module for using a library创建用于使用库的 cmake 模块
【发布时间】:2017-04-11 18:43:21
【问题描述】:

我是 C++ 新手,刚刚开始使用 Cmake 将库链接到我的项目。我需要使用库:

https://github.com/Gnimuc/FastPD

幸运的是,我设法使用 Cmake 构建了库(在我的构建中根本没有 *.lib 文件),但我不知道如何将它链接到我的项目。我的意思是我不知道如何将它添加到我的 cmakelists.txt 中:

(PS。我也在使用另外两个库 ITK 和 VTK;但我无法将上述库链接到我的项目或 main.cpp。)

################################################ 
cmake_minimum_required(VERSION 2.8)

project(My_project)

find_package(ITK REQUIRED)

include(${ITK_USE_FILE})

if (ITKVtkGlue_LOADED)

     find_package(VTK REQUIRED)

     include(${VTK_USE_FILE})

else()

    find_package(ItkVtkGlue REQUIRED)

    include(${ItkVtkGlue_USE_FILE})

    set(Glue ItkVtkGlue)

endif()


add_executable(My_project MACOSX_BUNDLE main.cpp)

target_link_libraries(My_project

  ${Glue}  ${VTK_LIBRARIES} ${ITK_LIBRARIES})

################################################  

提前感谢您的帮助,

【问题讨论】:

  • (in my build there is no *.lib file at all) - 您引用的项目肯定会创建库。库的扩展取决于操作系统和构建库时使用的CMake generator
  • Tsyvarev,感谢您的评论。我用过 cmake 2.0.8 和 3.0.2 和 win64;但是没有 *.lib。你能建造它吗?
  • 我查看了引用的项目 - 它不导出任何符号。在这种情况下,Visual Studio 不会生成 .lib 文件。你可以为项目的开发者填写错误报告。
  • Tsyyvaref,谢谢。你的意思是我不能再使用这个库了?

标签: c++ module cmake


【解决方案1】:

假设您安装了库及其头文件,然后您可以使用find_path 搜索头文件,并将找到的路径添加到include directories。然后就可以使用find_library搜索库,并使用target_link_libraries命令添加库。

【讨论】:

  • 非常感谢您的评论。只是一个问题,当我构建这个库时,没有 *.lib 文件。我的意思是在构建过程之后只有 *.h 、 *.cpp 和 *.dll 文件;并且没有 *.lib 文件。我应该如何链接这样的库?
  • 您可以查看this question。具体来说,FastPD 项目似乎没有明确导出函数和类。在 Windows 上,需要在编译函数和类时使用 dllexport 来装饰它们(在另一个项目中使用它们时需要使用 dllimport)。您的替代方法可能是创建一个静态库(即将 CMakeLists.txt 中的 SHARED 关键字替换为 add_libraray 中的 STATIC 关键字。
  • 再次感谢 Gert,事实上,关于 dllexport 和修饰函数,我没有明白你的意思。您能否再解释一下我应该如何处理这个库的功能?但是我按照您的建议更改了 CMakeLists.txt,共享为静态并构建库。现在,创建了一个 *.lib 文件,但 Cmake 无法将我的项目链接到该文件。请看这个消息:hpics.li/864f3cd
  • 关于 dllexport/import 您可以阅读here。关于您的错误,我假设您确实使用了find_path,然后在target_link_library 中使用了结果,但您必须使用find_library 的结果(更新问题以反映更改后的 CMakeLists.txt 会很有帮助)。
  • 嗨格特,再次感谢您的帮助。我把我的最终 CmakeLists.txt。也许您可以阅读并改进它...
【解决方案2】:

我尝试了 sharedstatic 类型来创建库。在 shared 的情况下,没有创建 *.lib 文件,在 static 的情况下,我的项目无法链接到图书馆。因此,在我项目的 CmakeLists.txt 中,我决定将 all *.cpp 和 headers 添加为 libraries,然后将它们链接 一起(因为我不知道它们之间的依赖关系!!!),最后,我将它们链接到我的项目。也许它没有意义,但它有效;希望对你有帮助:

CmakeLists.txt
##############################################

cmake_minimum_required(VERSION 2.6)

set(PROJ_NAME PROJECT46)
PROJECT(${PROJ_NAME})

# Prevent compilation in-source
if( ${CMAKE_BINARY_DIR} STREQUAL ${PROJECT_SOURCE_DIR} )
  Message( " " )
  Message( FATAL_ERROR "Source and build  directories are the same.
 Create an empty build directory,
 change into it and re-invoke cmake")
endif()

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support.     
Please use a different C++ compiler.")
endif()

##############################################
## External libraries
##############################################
list( APPEND CMAKE_MODULE_PATH
${PROJECT_SOURCE_DIR}/cmake
)

# Blitz
find_package( Blitz++ REQUIRED )
list( APPEND PROJ_INCLUDE_DIRS
${Blitz++_INCLUDE_DIR}
)
list( APPEND
PROJ_LIB
${Blitz++_LIBRARIES}
)










# ITK and VTK
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})

if (ITKVtkGlue_LOADED)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
else()
find_package(ItkVtkGlue REQUIRED)
include(${ItkVtkGlue_USE_FILE})
set(Glue ItkVtkGlue)
endif()
##############################################





# FASTPD
add_library(FASTPD Fast_PD.cpp Fast_PD.h common.h block.h)
add_library(GRAPH graph.h graph.cpp)
add_library(linked LinkedBlockList.h LinkedBlockList.cpp)
add_library(MAXFLOW maxflow.cpp)





include_directories(${PROJ_INCLUDE_DIRS})

add_executable(${PROJ_NAME} main.cpp)
target_link_libraries(linked MAXFLOW)
target_link_libraries(GRAPH linked)
target_link_libraries(FASTPD GRAPH)
target_link_libraries(${PROJ_NAME} FASTPD)

target_link_libraries(${PROJ_NAME}
    ${PROJ_LIB} ${Glue}  ${VTK_LIBRARIES} ${ITK_LIBRARIES}
)

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多