使用(预先打包的头文件和dll)创建一个exe和lib

时间:2012-05-07 10:17:29

标签: visual-c++ cmake

    cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
    project(ImageProc)

    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

    find_package(PCL 1.2 REQUIRED)
    find_package(OpenCV REQUIRED)

    add_definitions( -fPIC -Wall -O3)
    include_directories(${PCL_INCLUDE_DIRS})
    #link_directories(${PCL_LIBRARY_DIRS}) Dont think neccesary..
    add_definitions(${PCL_DEFINITIONS})

    add_executable (ImageProc svm.cpp ImageProc.cpp testImageProc.cpp)
    target_link_libraries (ImageProc ${OpenCV_LIBS} ${PCL_LIBRARIES})
    add_library(ImageProcLib STATIC svm.cpp ImageProc.cpp)
    target_link_libraries (ImageProcLib ${OpenCV_LIBS} ${PCL_LIBRARIES})

目前,我运行它并使用VS C ++打开并生成exe和lib。 exe在我的机器上运行。

目前的限制:
当我把exe传递给我的朋友时,他不能在他的机器上运行它,因为他遭到了许多丢失的dll的攻击。 当我使用lib文件时,要在VS C ++中创建一个新项目,找不到头文件会出现致命错误。
我知道,我可以手动添加所有dll和/或打包lib的所有头文件和库文件。但它也非常麻烦和丑陋。

问题:
CMake是否提供了一种方法,以便在编译时

  1. 一个exe(它会自动在bin目录中找到所有必要的dll)
  2. 进入lib(它会自动将所有头文件以及链接部分的必要库输出到lib目录中)

1 个答案:

答案 0 :(得分:0)

准备包以在其他开发环境中部署仍然是一项艰巨的任务。您需要正确设置自己的接口/ API,并且需要处理交叉dll问题,不同的运行时等。

但是,您可以使用CMake的一些工具:

  • 查看InstallExport。您可以使用它来指定(在您的CMakeLists.txt中)部署所需的文件。这样,您可以标记哪些头文件,以及哪些目标(libs和exes)应该部署。

  • 另请参阅CPack与NSIS的组合,可用于构建项目的NSIS安装程序。

  • 您可以与InstallRequiredSystemLibrariesBundleUtilities一起准备installpackage目标。另请参阅thisthis问题,了解如何将第三方dll添加到此类部署包中。

  • InstallRequiredSystemLibraries对于将vcredist附加到您自己的软件包安装程序非常有用,如果您要在非开发PC上安装项目,那么您肯定需要这样做。