基于CGAL、Qt5两层嵌套动态链接库的Cmake实现

1. 问题由来

因需要开发了一款基于CGAL的处理三维几何的子程序(简称子程序B),该子程序B被主程序A调用,我们知道CGAL还可以调用Qt5库用于图形显示,因此为了实现这一目标,设想利用Cmake制作一个可供主程序A调用的dll,此dll可调用CGAL,而CGAL又可调用Qt5。

程序A、B、CGAL、Qt5之间的流程:

主程序A->子程序B->CGAL->Qt5

Cmake实现子程序B封装成B.dll后:

主程序A->B.dll (CGAL)->Qt5

2. 解决过程

2.1 生成B.dll

建立子程序B的目录树,如下:

lib
├─CmakeLists.txt
├─build
├─include
└─src

将头文件和源文件分别拷贝到include和src文件夹下,编辑CmakeLists.txt文件,其内容如下:

project(my_dll)

cmake_minimum_required(VERSION 3.20)
cmake_policy(SET CMP0020 NEW)

set(CMAKE_CXX_STANDARD 17)

SET(INCDIR ./include/creat_point.h)
SET(SRCDIR ./src/creat_point.cpp ./src/dataIn.cpp ./src/lcc.cpp ./src/nef.cpp ./src/obb.cpp ./src/particle_basic.cpp ./src/poly.cpp 
./src/poly_ib.cpp ./src/rpp.cpp ./src/seeds.cpp ./src/type.cpp)

SET(LIBSRC ${SRCDIR} ${INCDIR})
SET(LIBRARY_OUTPUT_PATH  ./libdll)

find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)

if(CGAL_Qt5_FOUND)
  add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS)
endif()

find_package(CGAL QUIET COMPONENTS Core )

if ( CGAL_FOUND )
  include( ${CGAL_USE_FILE} )
  ADD_LIBRARY(creat_point SHARED ${LIBSRC})

  if(CGAL_Qt5_FOUND)
     target_link_libraries(creat_point PUBLIC CGAL::CGAL_Qt5)
  endif()

  SET_TARGET_PROPERTIES(
        creat_point
        PROPERTIES 
        LINKER_LANGUAGE C
        RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        OUTPUT_NAME "creat_point"
        PREFIX ""
        )
else()
   message(STATUS "This program requires the CGAL library, and will not be compiled.")  
endif()

2.2 调用B.dll

建立主程序A的目录树,如下:

test
├─CmakeLists.txt
├─test.cpp  #测试程序
├─build
└─poly #数据文件

主程序A(test.cpp)如下:

#include "../lib/include/creat_point.h" 
   
int main()
{
    creat_point();
    return 0;
}

test/CmakeLists.txt内容为:

project( test )

cmake_minimum_required(VERSION 3.20)

set(CMAKE_CXX_STANDARD 17)
set(TEST_LIB_DIR ../lib/build/libdll/Debug)
set(TEST_INCLUDE_DIR ../lib)
set(TEST_DLL_DIR ../lib/build/libdll/Debug)

find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)

if(CGAL_Qt5_FOUND)
  add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS)
endif()

find_package(CGAL QUIET COMPONENTS Core)

if ( CGAL_FOUND )
  include( ${CGAL_USE_FILE} )
  include( CGAL_CreateSingleSourceCGALProgram )
  create_single_source_cgal_program( "test.cpp" )
  if(CGAL_Qt5_FOUND)
       target_link_libraries(
             ${PROJECT_NAME} 
             PUBLIC 
             "${TEST_LIB_DIR}/creat_point.lib" 
             "CGAL::CGAL_Qt5"
             )
  endif()

  target_include_directories(
        ${PROJECT_NAME} 
        PUBLIC
        "${TEST_INCLUDE_DIR}/include"
        )
else()  
    message(STATUS "This program requires the CGAL library, and will not be compiled.")
endif()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值